This notebook includes:

Load packages needed and do initial data wrangling

library(abind)
library(sciplot)
library(tidyverse)
library(ggplot2)
library(RColorBrewer)
library(plyr)
library(dplyr)
library(ggpubr)
library(patchwork)
getwd()
[1] "/Users/saradellwilliams/Dropbox/My_Publications/SpatEpiSCTLD/SCTLDepizootiology_lowerFLkeys/NonSpatialAnalyses"
my.data<-read.csv("SCTLD_END_exta.csv", header=T) #shortened file with just one column per date with levels of 
my.data<-my.data[,-c(34:37)]
str(my.data)
'data.frame':   2012 obs. of  33 variables:
 $ Site     : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Plot     : int  23 23 23 23 23 23 23 23 23 23 ...
 $ Sps      : chr  "DLAB" "SINT" "SSID" "PPOR" ...
 $ Max_width: int  11 22 25 11 18 11 11 16 10 8 ...
 $ Coral_ID : chr  "1_p23_t1_s0_c1_DLAB" "1_p23_t1_s0_c2_SINT" "1_p23_t1_s0_c3_SSID" "1_p23_t1_s0_c4_PPOR" ...
 $ coords_x : num  0.448 0.789 0.834 0.226 0.463 ...
 $ coords_y : num  0.236 0.479 0.628 1.927 2.225 ...
 $ X5.1.18  : chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X6.1.18  : chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X6.21.18 : chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X7.16.18 : chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X8.17.18 : chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X10.30.18: chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X11.9.18 : chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X11.29.18: chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X12.13.18: chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X1.4.19  : chr  "Healthy" "Healthy" "Healthy" "Healthy" ...
 $ X1.18.19 :
Error in (function (srcref)  : unimplemented type (29) in 'eval'
Error: no more error handlers available (recursive errors?); invoking 'abort' restart
type 29 is unimplemented in 'type2char'Error in lapply(nf, function(n) eval(as.name(n))) : 
  INTEGER() can only be applied to a 'integer', not a 'unknown type #29'

Get the data into long format and get the timepoints into the right format for plotting via ggplot.

#move to a long format so that every row is now an observation of a colony at a single timepoint
data_long <- gather(my.data, key=timept, value=state, X5.1.18:X12.6.19,factor_key = TRUE)
head(data_long)
  Site Plot  Sps Max_width            Coral_ID coords_x  coords_y  timept   state
1    1   23 DLAB        11 1_p23_t1_s0_c1_DLAB 0.448071 0.2361312 X5.1.18 Healthy
2    1   23 SINT        22 1_p23_t1_s0_c2_SINT 0.789318 0.4790354 X5.1.18 Healthy
3    1   23 SSID        25 1_p23_t1_s0_c3_SSID 0.833828 0.6278998 X5.1.18 Healthy
4    1   23 PPOR        11 1_p23_t1_s0_c4_PPOR 0.225519 1.9267537 X5.1.18 Healthy
5    1   23 DSTO        18 1_p23_t1_s0_c5_DSTO 0.462908 2.2250339 X5.1.18 Healthy
6    1   23 CNAT        11 1_p23_t1_s0_c6_CNAT 0.151335 2.2052883 X5.1.18 Healthy
summary(as.factor(data_long$state))
   Dead Healthy   SCTLD Unknown 
   1530   49125     636    1021 
#make the health states factors
data_long$state<-factor(data_long$state,levels=c("Healthy","SCTLD","Dead","Unknown"))
data_long$timept<-revalue(data_long$timept, c( "X5.1.18"="05-10-18","X6.1.18"="06-01-18","X6.21.18"="06-21-18","X7.16.18"="07-16-18","X8.17.18"="08-17-18","X10.30.18"="10-30-18", "X11.9.18"="11-09-18", "X11.29.18"="11-29-18","X12.13.18"="12-13-18","X1.4.19"="01-04-19","X1.18.19"="01-18-19","X2.8.19"="02-08-19","X3.4.19"="03-04-19","X3.21.19"="03-21-19","X4.11.19"="04-11-19","X5.2.19"="05-02-19","X5.16.19"="05-16-19","X5.28.19"="05-28-19","X6.13.19"="06-13-19","X7.1.19"="07-01-19","X7.22.19"="07-22-19","X8.16.19"="08-16-19","X9.17.19"="09-17-19","X10.14.19"="10-14-19","X11.12.19"="11-12-19","X12.6.19"="12-06-19"))
summary(data_long)
      Site            Plot           Sps              Max_width     
 Min.   :1.000   Min.   :23.00   Length:52312       Min.   :  2.00  
 1st Qu.:1.000   1st Qu.:25.00   Class :character   1st Qu.: 11.00  
 Median :2.000   Median :28.00   Mode  :character   Median : 13.00  
 Mean   :2.039   Mean   :33.57                      Mean   : 22.79  
 3rd Qu.:3.000   3rd Qu.:45.00                      3rd Qu.: 23.00  
 Max.   :3.000   Max.   :47.00                      Max.   :450.00  
                                                                    
   Coral_ID            coords_x          coords_y            timept     
 Length:52312       Min.   :-0.0729   Min.   :-0.1202   05-10-18: 2012  
 Class :character   1st Qu.: 2.3136   1st Qu.: 2.2424   06-01-18: 2012  
 Mode  :character   Median : 4.7236   Median : 4.4857   06-21-18: 2012  
                    Mean   : 4.8322   Mean   : 4.6890   07-16-18: 2012  
                    3rd Qu.: 7.2089   3rd Qu.: 7.2046   08-17-18: 2012  
                    Max.   :10.0684   Max.   :10.0440   10-30-18: 2012  
                    NA's   :416       NA's   :416       (Other) :40240  
     state      
 Healthy:49125  
 SCTLD  :  636  
 Dead   : 1530  
 Unknown: 1021  
                
                
                

Group by species, site, plot, timept, and state

#group by species, site, plot, timept and state
tryfreq<-data_long%>%
  dplyr::group_by(Sps,Site,Plot,timept,state)%>%
  dplyr::summarise(num=n())%>%
  dplyr::group_by(Sps,Site,Plot,timept)%>%
  dplyr::mutate(Fraction=num/sum(num))
`summarise()` regrouping output by 'Sps', 'Site', 'Plot', 'timept' (override with `.groups` argument)
#tryfreq
#expands the data so that all health state factors are listed for each timepoint for each species and joins it with old tp_counts... it also takes a long time.
tp_counts2<-tryfreq%>%
  expand(state)%>% 
  left_join(tryfreq)

|===============================                           | 54% ~2 s remaining     
|===============================                           | 54% ~2 s remaining     
|===============================                           | 55% ~2 s remaining     
|================================                          | 56% ~2 s remaining     
|================================                          | 56% ~2 s remaining     
|=================================                         | 57% ~2 s remaining     
|=================================                         | 58% ~2 s remaining     
|==================================                        | 59% ~2 s remaining     
|==================================                        | 60% ~2 s remaining     
|===================================                       | 61% ~2 s remaining     
|====================================                      | 62% ~2 s remaining     
|=====================================                     | 64% ~1 s remaining     
|=====================================                     | 65% ~1 s remaining     
|======================================                    | 66% ~1 s remaining     
|=======================================                   | 68% ~1 s remaining     
|=======================================                   | 69% ~1 s remaining     
|========================================                  | 70% ~1 s remaining     
|=========================================                 | 71% ~1 s remaining     
|=========================================                 | 72% ~1 s remaining     
|==========================================                | 73% ~1 s remaining     
|==========================================                | 74% ~1 s remaining     
|===========================================               | 75% ~1 s remaining     
|============================================              | 76% ~1 s remaining     
|============================================              | 77% ~1 s remaining     
|=============================================             | 78% ~1 s remaining     
|==============================================            | 79% ~1 s remaining     
|==============================================            | 81% ~1 s remaining     
|===============================================           | 82% ~1 s remaining     
|===============================================           | 83% ~1 s remaining     
|================================================          | 84% ~1 s remaining     
|=================================================         | 85% ~1 s remaining     
|==================================================        | 86% ~1 s remaining     
|==================================================        | 88% ~1 s remaining     
|===================================================       | 89% ~0 s remaining     
|====================================================      | 90% ~0 s remaining     
|=====================================================     | 92% ~0 s remaining     
|=====================================================     | 93% ~0 s remaining     
|======================================================    | 94% ~0 s remaining     
|=======================================================   | 95% ~0 s remaining     
|=======================================================   | 96% ~0 s remaining     
|========================================================  | 98% ~0 s remaining     
|========================================================= | 99% ~0 s remaining     
Joining, by = c("Sps", "Site", "Plot", "timept", "state")
#previous step expands it by listing as NA, and now we make it so that NAs are 0s
tp_counts2[is.na(tp_counts2)] <- 0
#tp_counts2
fracs<-as.data.frame(tp_counts2)
colnames(fracs)[colnames(fracs)=="num"] <- "num_cols"
colnames(fracs)[colnames(fracs)=="Fraction"] <- "fraction"
summary(fracs)
     Sps                 Site            Plot            timept         state     
 Length:7696        Min.   :1.000   Min.   :23.00   05-10-18: 296   Healthy:1924  
 Class :character   1st Qu.:1.000   1st Qu.:25.00   06-01-18: 296   SCTLD  :1924  
 Mode  :character   Median :2.000   Median :28.00   06-21-18: 296   Dead   :1924  
                    Mean   :2.054   Mean   :33.42   07-16-18: 296   Unknown:1924  
                    3rd Qu.:3.000   3rd Qu.:45.00   08-17-18: 296                 
                    Max.   :3.000   Max.   :47.00   10-30-18: 296                 
                                                    (Other) :5920                 
    num_cols          fraction   
 Min.   :  0.000   Min.   :0.00  
 1st Qu.:  0.000   1st Qu.:0.00  
 Median :  0.000   Median :0.00  
 Mean   :  6.797   Mean   :0.25  
 3rd Qu.:  2.000   3rd Qu.:0.50  
 Max.   :160.000   Max.   :1.00  
                                 
head(fracs)
   Sps Site Plot   timept   state num_cols fraction
1 AAGA    2   28 05-10-18 Healthy        1        1
2 AAGA    2   28 05-10-18   SCTLD        0        0
3 AAGA    2   28 05-10-18    Dead        0        0
4 AAGA    2   28 05-10-18 Unknown        0        0
5 AAGA    2   28 06-01-18 Healthy        1        1
6 AAGA    2   28 06-01-18   SCTLD        0        0

We just really care about the species that showed disease signs

#filter out the not susceptible species
fracs_dis_sps<-fracs%>%
  filter(Sps!="AAGA",Sps!="ACER",Sps!="ATEN",Sps!="EFAS",Sps!="MANG",Sps!="MMEA",Sps!="MYCE",Sps!="OCUL",Sps!="ODIF",Sps!="PAST",Sps!="PDIV",Sps!="PPOR",Sps!="SRAD")%>%
  droplevels()
fracs_dis_sps$Sps<-as.factor(fracs_dis_sps$Sps)
str(fracs_dis_sps)
'data.frame':   5720 obs. of  7 variables:
 $ Sps     : Factor w/ 11 levels "CNAT","DLAB",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Site    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Plot    : int  23 23 23 23 23 23 23 23 23 23 ...
 $ timept  : Factor w/ 26 levels "05-10-18","06-01-18",..: 1 1 1 1 2 2 2 2 3 3 ...
 $ state   : Factor w/ 4 levels "Healthy","SCTLD",..: 1 2 3 4 1 2 3 4 1 2 ...
 $ num_cols: int  3 0 0 0 3 0 0 0 3 0 ...
 $ fraction: num  1 0 0 0 1 0 0 0 1 0 ...

Plot each site separately as a multipanel grid of plot number (cols) and species (rows)

fracs_dis_sps$dates<-as.character(fracs_dis_sps$timept)
fracs_dis_sps$dates<-as.Date(fracs_dis_sps$dates,"%m-%d-%y")
site1<-fracs_dis_sps%>%
  filter(Site==1,state!="Unknown")%>%
  droplevels()
site1$state<-factor(site1$state,levels=c("Healthy","SCTLD","Dead"))#,"Unknown","TreatedUnknown","Treated"))
species_time<-ggplot(data=site1,mapping=aes(x=dates,y=fraction,color=state))
species_time+
  geom_line(aes(color=state))+facet_grid(Sps~Plot)+
  geom_point(aes(color=state))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous("Fraction of Colonies",breaks=c(0,0.2,0.4,0.6,0.8,1))+
  scale_x_date("Survey Dates 2018-2019",date_breaks = "2 months",date_labels = "%m %d %y")+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","TreatedUnknown"="lightgoldenrod","Treated"="darkorange4","Unknown"="grey"),labels=c("Healthy","SCTLD","Dead","Unknown"),drop=FALSE)+
  ggtitle("Mid-Channel")+
  theme(axis.text.x = element_text(angle=70, hjust=1))

site2<-fracs_dis_sps%>%
  filter(Site==2,state!="Unknown")%>%
  droplevels()
site2$state<-factor(site2$state,levels=c("Healthy","SCTLD","Dead"))
ggplot(data=site2,mapping=aes(x=dates,y=fraction,color=state))+
  geom_line(aes(color=state))+facet_grid(Sps~Plot)+
  geom_point(aes(color=state))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous("Fraction of Colonies",breaks=c(0,0.2,0.4,0.6,0.8,1))+
  scale_x_date("Survey Dates 2018-2019",date_breaks = "2 months",date_labels = "%m %d %y")+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","TreatedUnknown"="lightgoldenrod","Treated"="darkorange4","Unknown"="grey","TreatedSCTLD"="orange"),labels=c("Healthy","SCTLD","Dead","Unknown"),drop=FALSE)+
  ggtitle("Off-Shore")+
  theme(axis.text.x = element_text(angle=70, hjust=1))

site3<-fracs_dis_sps%>%
  filter(Site==3,state!="Unknown")%>%
  droplevels()
site3$state<-factor(site3$state,levels=c("Healthy","SCTLD","Dead"))
ggplot(data=site1,mapping=aes(x=dates,y=fraction,color=state))+
  geom_line(aes(color=state))+facet_grid(Sps~Plot)+
  geom_point(aes(color=state))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous("Fraction of Colonies",breaks=c(0,0.2,0.4,0.6,0.8,1))+
  scale_x_date("Survey Dates 2018-2019",date_breaks = "2 months",date_labels = "%m %d %y")+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","TreatedUnknown"="lightgoldenrod","Treated"="darkorange4","Unknown"="grey","TreatedSCTLD"="orange"),labels=c("Healthy","SCTLD","Dead","Unknown"),drop=FALSE)+
  ggtitle("Nearshore")+
  theme(axis.text.x = element_text(angle=70, hjust=1))

Now let's 'group by' down to Plot, not species at each plot

With only species that got disease

#group by species, site, plot, timept and state
data_long_dis<-data_long%>%
  filter(Sps!="AAGA",Sps!="ACER",Sps!="ATEN",Sps!="EFAS",Sps!="MANG",Sps!="MMEA",Sps!="MYCE",Sps!="OCUL",Sps!="ODIF",Sps!="PAST",Sps!="PDIV",Sps!="PPOR",Sps!="SRAD")%>%
  droplevels()
tryfreq_plot_dis<-data_long_dis%>%
  dplyr::group_by(Site,Plot,timept,state)%>%
  dplyr::summarise(num=n())%>%
  dplyr::group_by(Site,Plot,timept)%>%
  dplyr::mutate(Fraction=num/sum(num))
`summarise()` regrouping output by 'Site', 'Plot', 'timept' (override with `.groups` argument)
tryfreq_plot_dis
# A tibble: 466 x 6
# Groups:   Site, Plot, timept [156]
    Site  Plot timept   state     num Fraction
   <int> <int> <fct>    <fct>   <int>    <dbl>
 1     1    23 05-10-18 Healthy   211  1      
 2     1    23 06-01-18 Healthy   211  1      
 3     1    23 06-21-18 Healthy   211  1      
 4     1    23 07-16-18 Healthy   211  1      
 5     1    23 08-17-18 Healthy   210  0.995  
 6     1    23 08-17-18 Unknown     1  0.00474
 7     1    23 10-30-18 Healthy   210  0.995  
 8     1    23 10-30-18 Dead        1  0.00474
 9     1    23 11-09-18 Healthy   209  0.991  
10     1    23 11-09-18 Dead        1  0.00474
# … with 456 more rows
#expands the data so that all health state factors are listed for each timepoint for each species and joins it with old tp_counts... it also takes a long time.
tp_counts2_plot_dis<-tryfreq_plot_dis%>%
  expand(state)%>% 
  left_join(tryfreq_plot_dis)
Joining, by = c("Site", "Plot", "timept", "state")
#previous step expands it by listing as NA, and now we make it so that NAs are 0s
tp_counts2_plot_dis[is.na(tp_counts2_plot_dis)] <- 0
tp_counts2_plot_dis
# A tibble: 624 x 6
# Groups:   Site, Plot, timept [156]
    Site  Plot timept   state     num Fraction
   <int> <int> <fct>    <fct>   <int>    <dbl>
 1     1    23 05-10-18 Healthy   211        1
 2     1    23 05-10-18 SCTLD       0        0
 3     1    23 05-10-18 Dead        0        0
 4     1    23 05-10-18 Unknown     0        0
 5     1    23 06-01-18 Healthy   211        1
 6     1    23 06-01-18 SCTLD       0        0
 7     1    23 06-01-18 Dead        0        0
 8     1    23 06-01-18 Unknown     0        0
 9     1    23 06-21-18 Healthy   211        1
10     1    23 06-21-18 SCTLD       0        0
# … with 614 more rows
fracs_plot_dis<-as.data.frame(tp_counts2_plot_dis)
colnames(fracs_plot_dis)[colnames(fracs_plot_dis)=="num"] <- "num_cols"
colnames(fracs_plot_dis)[colnames(fracs_plot_dis)=="Fraction"] <- "fraction"
summary(fracs_plot_dis)
      Site        Plot           timept        state        num_cols     
 Min.   :1   Min.   :23.0   05-10-18: 24   Healthy:156   Min.   :  0.00  
 1st Qu.:1   1st Qu.:25.0   06-01-18: 24   SCTLD  :156   1st Qu.:  0.00  
 Median :2   Median :27.5   06-21-18: 24   Dead   :156   Median :  6.00  
 Mean   :2   Mean   :32.5   07-16-18: 24   Unknown:156   Mean   : 63.83  
 3rd Qu.:3   3rd Qu.:45.0   08-17-18: 24                 3rd Qu.: 75.25  
 Max.   :3   Max.   :47.0   10-30-18: 24                 Max.   :383.00  
                            (Other) :480                                 
    fraction     
 Min.   :0.0000  
 1st Qu.:0.0000  
 Median :0.0250  
 Mean   :0.2500  
 3rd Qu.:0.3167  
 Max.   :1.0000  
                 
head(fracs_plot_dis)
  Site Plot   timept   state num_cols fraction
1    1   23 05-10-18 Healthy      211        1
2    1   23 05-10-18   SCTLD        0        0
3    1   23 05-10-18    Dead        0        0
4    1   23 05-10-18 Unknown        0        0
5    1   23 06-01-18 Healthy      211        1
6    1   23 06-01-18   SCTLD        0        0
fracs_plot_dis$dates<-as.character(fracs_plot_dis$timept)
fracs_plot_dis$dates<-as.Date(fracs_plot_dis$dates,"%m-%d-%y")
sitelabels<-c('1'="Mid-Channel",'2'="Offshore",'3'="Nearshore")
site1<-fracs_plot_dis%>%
  filter(Site==1)
species_time<-ggplot(data=site1,mapping=aes(x=dates,y=fraction,color=state))
site1plot<-species_time+
  geom_line(aes(color=state))+facet_grid(Plot~Site,labeller=labeller(Site = sitelabels))+
  geom_point(aes(color=state))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous(" ",breaks=c(0,0.2,0.4,0.6,0.8,1))+
  scale_x_date("Survey Dates 2018-2019")+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=FALSE)
site2<-fracs_plot_dis%>%
  filter(Site==2)
species_time<-ggplot(data=site2,mapping=aes(x=dates,y=fraction,color=state))
site2plot<-species_time+
  geom_line(aes(color=state))+facet_grid(Plot~Site,labeller=labeller(Site = sitelabels))+
  geom_point(aes(color=state))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous(" ",breaks=c(0,0.2,0.4,0.6,0.8,1))+
  scale_x_date("Survey Dates 2018-2019")+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=FALSE)
site3<-fracs_plot_dis%>%
  filter(Site==3)
species_time<-ggplot(data=site3,mapping=aes(x=dates,y=fraction,color=state))
site3plot<-species_time+
  geom_line(aes(color=state))+facet_grid(Plot~Site,labeller=labeller(Site = sitelabels))+
  geom_point(aes(color=state))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous("Fraction of Colonies with SCTLD",breaks=c(0,0.2,0.4,0.6,0.8,1))+
  scale_x_date("Survey Dates 2018-2019")+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=FALSE)
ggarrange(site3plot,site1plot,site2plot, ncol=3,common.legend=TRUE)

Get stats (mean +/- Standard error) for each site where plots are treated as replicates

fraction of colonies

site.means<-aggregate(fraction~state+dates+Site,FUN=mean,data=fracs_plot_dis)
site.se<-aggregate(fraction~state+dates+Site,FUN=function(x) sd(x)/sqrt(length(x)),data=fracs_plot_dis)
#site.se
stats<-cbind(site.means,stander=site.se$fraction)
#sitelabels
stats$Site<-as.factor(stats$Site)
levels(stats$Site)
[1] "1" "2" "3"
stats$Site <- factor(stats$Site,levels(stats$Site)[c(3,1,2)])
#just look at diseased and dead
stats_filtered<-stats%>%
  filter(state!="Unknown",state!="Healthy")
ggplot(data=stats_filtered,mapping=aes(x=dates,y=fraction,color=state))+
  geom_line(aes(color=state))+facet_wrap(~Site,nrow=3,labeller=labeller(Site = sitelabels))+
  geom_point(aes(color=state))+geom_pointrange(aes(color=state,ymin=fraction-1.96*stander, ymax=fraction+1.96*stander))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous("Fraction of Colonies with SCTLD",c(0,0.2),breaks=c(0,0.05,0.1,0.15,0.2))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black"),drop=TRUE)+
  #ggtitle("Disease Prevalence (all surveyed corals)")+
  theme(axis.text.x = element_text(angle=70, hjust=1))+scale_x_date("Survey Dates 2018-2019", breaks=stats$dates,date_labels="%b %d %y")+theme(legend.position = "right")

all data temporal dynamics

#sites (averaged plots) are replicates
all.means<-aggregate(fraction~state+dates,FUN=mean,data=site.means)
all.se<-aggregate(fraction~state+dates,FUN=function(x) sd(x)/sqrt(length(x)),data=site.means)
all.stats<-cbind(all.means,stander=all.se$fraction)
#all.stats
#all_filtered<-all.stats%>%
 # filter(state!="Unknown")
### you have to play with this bit to get it in the right order
#stats_filtered$Site <- factor(stats_filtered$Site,levels(stats_filtered$Site)[c(3,2,1)])
#levels(stats_filtered$Site)
#sitelabels
species_time<-ggplot(data=all.stats,mapping=aes(x=dates,y=fraction,color=state))
species_time+
  geom_line(aes(color=state))+
  geom_point(aes(color=state))+geom_pointrange(aes(color=state,ymin=fraction-1.96*stander, ymax=fraction+1.96*stander))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous("Fraction of Colonies with SCTLD",c(0.1,1),breaks=c(0.1,0.2,0.4,0.6,0.8,1))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  #ggtitle("Disease Prevalence (all surveyed corals)")+
  theme(axis.text.x = element_text(angle=70, hjust=1))+scale_x_date("Survey Dates 2018-2019", breaks=all.stats$dates,date_labels="%b %d %y")+theme(legend.position = "bottom")

blow up to dis and dead, fraction colonies

all_filtered<-all.stats%>%
  filter(state!="Healthy",state!="Unknown")
species_time<-ggplot(data=all_filtered,mapping=aes(x=dates,y=fraction,color=state))
species_time+
  geom_line(aes(color=state))+
  geom_point(aes(color=state))+geom_pointrange(aes(color=state,ymin=fraction-stander, ymax=fraction+stander))+
  theme_bw()+
  theme(panel.grid.minor =element_blank())+
  scale_y_continuous("Fraction of colonies",c(0,0.2),breaks=c(0,0.05,0.1,0.15,0.2))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  #ggtitle("Disease Prevalence (all surveyed corals)")+
  theme(axis.text.x = element_text(angle=70, hjust=1))+scale_x_date("Survey Dates 2018-2019", breaks=all.stats$dates,date_labels="%b %d %y")+theme(legend.position = "bottom")

Now with incidence

need the new_inf_corals function to determine the newly diseased corals

new_inf_corals<-function(df,steps,x){
  ## newly_I
  newly_I<-matrix(0, nrow = nrow(df), ncol = steps) #blank matrix for storing newly infected corals
  #newly_I
  for (i in 1:steps){ #for each survey time point
    col<-x+i #start with first tp after init tp
    prev<-x+i-1
    for (j in 1:(nrow(df))){ #for each row in the df
      #print (df[j,col])
      if ( df[j,col]=="SCTLD" ){ #if it's disease
        #print( "found one")
        if (df[j,prev]!="SCTLD"){ # and if it wasnt diseased before
          newly_I[j,i]<-1 #add it to newly infected
        }
      }
    }
  }
  return(newly_I)
}
#need just suscpetible species
dis.sps<-my.data%>%
  filter(Sps!="AAGA",Sps!="ACER",Sps!="ATEN",Sps!="EFAS",Sps!="MANG",Sps!="MMEA",Sps!="MYCE",Sps!="OCUL",Sps!="ODIF",Sps!="PAST",Sps!="PDIV",Sps!="PPOR",Sps!="SRAD")%>%
  droplevels()
#ok, shorten dis.sps dataset to just 10/30/19-12/6/19, becuase didnt see disease until then
## this is the wide format dataset
#colnames(dis.sps)
my.datas<-dis.sps%>%
  dplyr::select(Site,Plot,Sps,coords_x,coords_y,X8.17.18,X10.30.18,X11.9.18,X11.29.18,X12.13.18,X1.4.19,X1.18.19,X2.8.19,X3.4.19,X3.21.19,X4.11.19,X5.2.19,X5.16.19,X5.28.19,X6.13.19,X7.1.19,X7.22.19,X8.16.19,X9.17.19,X10.14.19,X11.12.19,X12.6.19)
colnames(dis.sps)
 [1] "Site"      "Plot"      "Sps"       "Max_width" "Coral_ID"  "coords_x" 
 [7] "coords_y"  "X5.1.18"   "X6.1.18"   "X6.21.18"  "X7.16.18"  "X8.17.18" 
[13] "X10.30.18" "X11.9.18"  "X11.29.18" "X12.13.18" "X1.4.19"   "X1.18.19" 
[19] "X2.8.19"   "X3.4.19"   "X3.21.19"  "X4.11.19"  "X5.2.19"   "X5.16.19" 
[25] "X5.28.19"  "X6.13.19"  "X7.1.19"   "X7.22.19"  "X8.16.19"  "X9.17.19" 
[31] "X10.14.19" "X11.12.19" "X12.6.19" 
#refactor data to all have same levels
my.datas$X8.17.18<-factor(my.datas$X8.17.18,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X10.30.18<-factor(my.datas$X10.30.18,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X11.9.18<-factor(my.datas$X11.9.18,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X11.29.18<-factor(my.datas$X11.29.18,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X12.13.18<-factor(my.datas$X12.13.18,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X1.4.19<-factor(my.datas$X1.4.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X1.18.19<-factor(my.datas$X1.18.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X2.8.19<-factor(my.datas$X2.8.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X3.4.19<-factor(my.datas$X3.4.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X3.21.19<-factor(my.datas$X3.21.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X4.11.19<-factor(my.datas$X4.11.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X5.2.19<-factor(my.datas$X5.2.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X5.16.19<-factor(my.datas$X5.16.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X5.28.19<-factor(my.datas$X5.28.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X6.13.19<-factor(my.datas$X6.13.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X7.1.19<-factor(my.datas$X7.1.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X7.22.19<-factor(my.datas$X7.22.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X8.16.19<-factor(my.datas$X8.16.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X9.17.19<-factor(my.datas$X9.17.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X10.14.19<-factor(my.datas$X10.14.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X11.12.19<-factor(my.datas$X11.12.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
my.datas$X12.6.19<-factor(my.datas$X12.6.19,levels=c("Healthy","SCTLD","Dead","Unknown"))
head(my.datas)
  Site Plot  Sps coords_x  coords_y X8.17.18 X10.30.18 X11.9.18 X11.29.18 X12.13.18
1    1   23 DLAB 0.448071 0.2361312  Healthy   Healthy  Healthy   Healthy   Healthy
2    1   23 SINT 0.789318 0.4790354  Healthy   Healthy  Healthy   Healthy   Healthy
3    1   23 SSID 0.833828 0.6278998  Healthy   Healthy  Healthy   Healthy   Healthy
4    1   23 DSTO 0.462908 2.2250339  Healthy   Healthy  Healthy   Unknown   Healthy
5    1   23 CNAT 0.151335 2.2052883  Healthy      Dead     Dead      Dead      Dead
6    1   23 SINT 0.314540 5.9977166  Healthy   Healthy  Healthy   Healthy   Healthy
  X1.4.19 X1.18.19 X2.8.19 X3.4.19 X3.21.19 X4.11.19 X5.2.19 X5.16.19 X5.28.19
1 Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy  Healthy
2 Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy  Healthy
3 Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy  Healthy
4   SCTLD    SCTLD   SCTLD   SCTLD    SCTLD    SCTLD   SCTLD    SCTLD     Dead
5    Dead     Dead    Dead    Dead     Dead     Dead    Dead     Dead     Dead
6 Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy  Healthy
  X6.13.19 X7.1.19 X7.22.19 X8.16.19 X9.17.19 X10.14.19 X11.12.19 X12.6.19
1  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy  Healthy
2  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy  Healthy
3  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy  Healthy
4     Dead    Dead     Dead     Dead     Dead      Dead      Dead     Dead
5     Dead    Dead     Dead     Dead     Dead      Dead      Dead     Dead
6  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy  Healthy
#Split into plots for analysis
s3.p45<-my.datas%>%
  filter(Plot==45)
s3.p47<-my.datas%>%
  filter(Plot==47)
s1.p23<-my.datas%>%
  filter(Plot==23)
s1.p25<-my.datas%>%
  filter(Plot==25)
s2.p27<-my.datas%>%
  filter(Plot==27)
s2.p28<-my.datas%>%
  filter(Plot==28)

Incidence Rates

plotnum<-s3.p45
s3.p45
   Site Plot  Sps coords_x  coords_y X8.17.18 X10.30.18 X11.9.18 X11.29.18
1     3   45 SSID 0.426747 1.4329768  Healthy   Healthy  Healthy   Healthy
2     3   45 SBOU 0.936817 2.1973145  Healthy   Healthy  Healthy   Healthy
3     3   45 SBOU 0.423617 2.1276741  Healthy   Healthy  Healthy   Healthy
4     3   45 SSID 0.366295 2.8532658  Healthy   Healthy  Healthy   Healthy
5     3   45 SINT 0.337989 3.1371188  Healthy   Healthy  Healthy   Healthy
6     3   45 SSID 0.336282 3.5160446  Healthy   Healthy  Healthy   Healthy
7     3   45 SINT 0.574249 4.6874716  Healthy   Healthy  Healthy   Healthy
8     3   45 SBOU 0.384359 4.8429677  Healthy   Healthy  Healthy   Healthy
9     3   45 SSID 0.867547 5.5753869  Healthy   Healthy  Healthy   Healthy
10    3   45 PSTR 0.352498 5.9162494  Healthy   Healthy  Healthy   Healthy
11    3   45 SINT 0.513939 6.0761834  Healthy   Healthy  Healthy   Healthy
12    3   45 PSTR 0.375967 6.7060196  Healthy   Healthy  Healthy   Healthy
13    3   45 SINT 0.835827 6.6170915  Healthy   Healthy  Healthy   Healthy
14    3   45 DSTO 0.969959 6.8398384  Healthy   Healthy  Healthy   Healthy
15    3   45 CNAT 0.374403 7.0533682  Healthy   Healthy  Healthy   Healthy
16    3   45 CNAT 1.076354 7.2201297  Healthy   Healthy  Healthy   Healthy
17    3   45 SINT 1.127418 7.8839326  Healthy   Healthy  Healthy   Healthy
18    3   45 SINT 0.938097 7.9131202  Healthy   Healthy  Healthy   Healthy
19    3   45 SINT 1.044635 8.2618343  Healthy   Healthy  Healthy   Healthy
20    3   45 SSID 0.907943 8.6074761  Healthy   Healthy  Healthy   Healthy
21    3   45 CNAT 1.675467 0.2171711  Healthy   Healthy  Healthy   Healthy
22    3   45 PSTR 1.400233 1.3189577  Healthy   Healthy  Healthy   Healthy
23    3   45 SINT 1.671057 1.1960628  Healthy   Healthy  Healthy   Healthy
24    3   45 SINT 1.507197 1.5729404  Healthy   Healthy  Healthy   Healthy
25    3   45 SSID 2.019259 1.8951980  Healthy   Healthy  Healthy   Healthy
26    3   45 SINT 1.640760 1.9219959  Healthy   Healthy  Healthy   Healthy
27    3   45 SSID 1.393548 2.8030838  Healthy   Healthy  Healthy   Healthy
28    3   45 SINT 1.581304 3.1212449  Healthy   Healthy  Healthy   Healthy
29    3   45 MCAV 1.741039 3.6601047  Healthy   Healthy  Healthy   Healthy
30    3   45 MCAV 1.764935 4.3551434  Healthy   Healthy  Healthy   Healthy
31    3   45 SINT 1.330678 4.7601843  Healthy   Healthy  Healthy   Healthy
32    3   45 SINT 2.010156 3.9161356  Healthy   Healthy  Healthy   Healthy
33    3   45 SBOU 1.702350 6.2490897  Healthy   Healthy  Healthy   Healthy
34    3   45 SINT 1.423987 8.0455735  Healthy   Healthy  Healthy   Healthy
35    3   45 MCAV 1.910162 8.1148726  Healthy   Healthy  Healthy   Healthy
36    3   45 SINT 1.988251 8.7790168  Healthy   Healthy  Healthy   Healthy
37    3   45 SINT 1.824391 9.1558944  Healthy   Healthy  Healthy   Healthy
   X12.13.18 X1.4.19 X1.18.19 X2.8.19 X3.4.19 X3.21.19 X4.11.19 X5.2.19 X5.16.19
1    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
2    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
3    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
4    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
5    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
6    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
7    Healthy Healthy  Healthy Unknown Unknown  Unknown  Unknown Healthy  Healthy
8    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Unknown
9    Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
10   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
11   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
12   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
13   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
14   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
15   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy    SCTLD
16   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy    SCTLD
17   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
18   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
19   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
20   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
21   Healthy Healthy  Healthy Healthy Healthy  Healthy    SCTLD    Dead     Dead
22   Healthy Healthy  Healthy Healthy Healthy  Healthy    SCTLD   SCTLD    SCTLD
23   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
24   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
25   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
26   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
27   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
28   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
29   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
30   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
31   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
32   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
33   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
34   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
35   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
36   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
37   Healthy Healthy  Healthy Healthy Healthy  Healthy  Healthy Healthy  Healthy
   X5.28.19 X6.13.19 X7.1.19 X7.22.19 X8.16.19 X9.17.19 X10.14.19 X11.12.19
1   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
2   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
3   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
4   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
5   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
6   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
7   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
8   Unknown  Unknown Healthy  Healthy  Healthy  Healthy   Healthy   Unknown
9   Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
10  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
11  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
12  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
13  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
14  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
15     Dead     Dead    Dead     Dead     Dead     Dead      Dead      Dead
16    SCTLD     Dead    Dead     Dead     Dead     Dead      Dead      Dead
17  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
18  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
19  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
20  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
21     Dead     Dead    Dead     Dead     Dead     Dead      Dead      Dead
22     Dead     Dead    Dead     Dead     Dead     Dead      Dead      Dead
23  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
24  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Unknown   Unknown
25  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy     SCTLD
26  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Unknown   Unknown
27  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
28  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
29  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
30  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
31  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
32  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Unknown   Unknown
33  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
34  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
35  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
36  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
37  Healthy  Healthy Healthy  Healthy  Healthy  Healthy   Healthy   Healthy
   X12.6.19
1   Healthy
2   Healthy
3   Healthy
4   Healthy
5   Healthy
6   Healthy
7   Healthy
8   Unknown
9   Healthy
10  Healthy
11  Healthy
12  Healthy
13  Healthy
14  Healthy
15     Dead
16     Dead
17  Healthy
18  Healthy
19  Healthy
20  Healthy
21     Dead
22     Dead
23  Healthy
24  Unknown
25    SCTLD
26  Unknown
27  Healthy
28  Healthy
29  Healthy
30  Healthy
31  Healthy
32  Unknown
33  Healthy
34  Healthy
35  Healthy
36  Healthy
37  Healthy
 [ reached 'max' / getOption("max.print") -- omitted 203 rows ]
x<-6 #start date
steps<-ncol(plotnum)-x 
steps
[1] 21
p45.newinf<-new_inf_corals(plotnum,steps,x)
colSums(p45.newinf)
 [1]  0  0  0  0  0  0  0  4  3 11  7 10  2  6  0  0  0  1  1  6  2
#length(colSums(p45.newinf))
p45.incidence<-cbind(colnames(s3.p45)[7:ncol(plotnum)], (colSums(p45.newinf)))
p45.incidence<-data.frame(p45.incidence)
colnames(p45.incidence)<-c("date","newI")
p45.incidence
        date newI
1  X10.30.18    0
2   X11.9.18    0
3  X11.29.18    0
4  X12.13.18    0
5    X1.4.19    0
6   X1.18.19    0
7    X2.8.19    0
8    X3.4.19    4
9   X3.21.19    3
10  X4.11.19   11
11   X5.2.19    7
12  X5.16.19   10
13  X5.28.19    2
14  X6.13.19    6
15   X7.1.19    0
16  X7.22.19    0
17  X8.16.19    0
18  X9.17.19    1
19 X10.14.19    1
20 X11.12.19    6
21  X12.6.19    2
#now plot 47
plotnum<-s3.p47
x<-6 #start date
steps<-ncol(plotnum)-x
p47.newinf<-new_inf_corals(plotnum,steps,x)
#p47.newinf
#length(colSums(p47.newinf))
p47.incidence<-cbind(colnames(s3.p47)[7:ncol(plotnum)],(colSums(p47.newinf)))
p47.incidence<-data.frame(p47.incidence)
colnames(p47.incidence)<-c("date","newI")
#p47.incidence
plotnum<-s1.p23
x<-6 #start date
steps<-ncol(plotnum)-x 
steps
[1] 21
p23.newinf<-new_inf_corals(plotnum,steps,x)
p23.newinf
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
  [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [2,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [3,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [4,]    0    0    0    0    1    0    0    0    0     0     0     0     0     0
  [5,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [6,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [7,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [8,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [9,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [10,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [11,]    0    0    0    0    1    0    0    0    0     0     0     0     0     0
 [12,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [13,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [14,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [15,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [16,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [17,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [18,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [19,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [20,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [21,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [22,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [23,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [24,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [25,]    0    0    0    0    0    0    0    1    0     0     0     0     0     0
 [26,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [27,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [28,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [29,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [30,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [31,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [32,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [33,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [34,]    0    0    0    0    0    0    0    0    0     0     1     0     0     0
 [35,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [36,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [37,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [38,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [39,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [40,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [41,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [42,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [43,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [44,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [45,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [46,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [47,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
       [,15] [,16] [,17] [,18] [,19] [,20] [,21]
  [1,]     0     0     0     0     0     0     0
  [2,]     0     0     0     0     0     0     0
  [3,]     0     0     0     0     0     0     0
  [4,]     0     0     0     0     0     0     0
  [5,]     0     0     0     0     0     0     0
  [6,]     0     0     0     0     0     0     0
  [7,]     0     0     0     0     0     0     0
  [8,]     0     0     0     0     0     0     0
  [9,]     0     0     0     0     0     0     0
 [10,]     0     0     0     0     0     0     0
 [11,]     0     0     0     0     0     0     0
 [12,]     0     0     0     0     0     0     0
 [13,]     0     0     0     0     0     0     0
 [14,]     0     0     0     0     0     0     0
 [15,]     0     0     0     0     0     0     0
 [16,]     0     0     0     0     0     0     0
 [17,]     0     0     0     0     0     0     0
 [18,]     0     0     0     0     0     0     0
 [19,]     0     0     0     0     0     0     0
 [20,]     0     0     0     0     0     0     0
 [21,]     0     0     0     0     0     0     0
 [22,]     0     0     0     0     0     0     0
 [23,]     0     0     0     0     0     0     0
 [24,]     0     0     0     0     0     0     0
 [25,]     0     0     0     0     0     0     0
 [26,]     0     0     0     0     0     0     0
 [27,]     0     0     0     0     0     0     0
 [28,]     0     0     0     0     0     0     0
 [29,]     0     0     0     0     0     0     0
 [30,]     0     0     0     0     0     0     0
 [31,]     0     0     0     0     0     0     0
 [32,]     0     0     0     0     0     0     0
 [33,]     0     0     0     0     0     0     0
 [34,]     0     0     0     0     0     0     0
 [35,]     0     0     0     0     0     0     0
 [36,]     0     0     0     0     0     0     0
 [37,]     0     0     0     0     0     0     0
 [38,]     0     0     0     0     0     0     0
 [39,]     0     0     0     0     0     0     0
 [40,]     0     0     0     0     0     0     0
 [41,]     0     0     0     0     0     0     0
 [42,]     0     0     0     0     0     0     0
 [43,]     0     0     0     0     0     0     0
 [44,]     0     0     0     0     0     0     0
 [45,]     0     0     0     0     0     0     0
 [46,]     0     0     0     0     0     0     0
 [47,]     0     0     0     0     0     0     0
 [ reached getOption("max.print") -- omitted 164 rows ]
#length(colSums(p45.newinf))
p23.incidence<-cbind(colnames(s1.p23)[7:ncol(plotnum)], (colSums(p23.newinf)))
p23.incidence<-data.frame(p23.incidence)
colnames(p23.incidence)<-c("date","newI")
p23.incidence
        date newI
1  X10.30.18    0
2   X11.9.18    0
3  X11.29.18    0
4  X12.13.18    0
5    X1.4.19    4
6   X1.18.19    0
7    X2.8.19    1
8    X3.4.19    2
9   X3.21.19    0
10  X4.11.19    1
11   X5.2.19    1
12  X5.16.19    1
13  X5.28.19    1
14  X6.13.19    1
15   X7.1.19    0
16  X7.22.19    0
17  X8.16.19    0
18  X9.17.19    0
19 X10.14.19    0
20 X11.12.19    0
21  X12.6.19    1
#now plot 25
plotnum<-s1.p25
x<-6 #start date
steps<-ncol(plotnum)-x
p25.newinf<-new_inf_corals(plotnum,steps,x)
#p47.newinf
#length(colSums(p47.newinf))
p25.incidence<-cbind(colnames(s1.p25)[7:ncol(plotnum)],(colSums(p25.newinf)))
p25.incidence<-data.frame(p25.incidence)
colnames(p25.incidence)<-c("date","newI")
#p47.incidence
plotnum<-s2.p27
x<-6 #start date
steps<-ncol(plotnum)-x 
steps
[1] 21
p27.newinf<-new_inf_corals(plotnum,steps,x)
p27.newinf
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
  [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [2,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [3,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [4,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [5,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [6,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [7,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [8,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
  [9,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [10,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [11,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [12,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [13,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [14,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [15,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [16,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [17,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [18,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [19,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [20,]    1    0    0    0    0    0    0    0    0     0     0     0     0     0
 [21,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [22,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [23,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [24,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [25,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [26,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [27,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [28,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [29,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [30,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [31,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [32,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [33,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [34,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [35,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [36,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [37,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [38,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [39,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [40,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [41,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [42,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [43,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [44,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [45,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [46,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
 [47,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0
       [,15] [,16] [,17] [,18] [,19] [,20] [,21]
  [1,]     0     0     0     0     0     0     0
  [2,]     0     0     0     0     0     0     0
  [3,]     0     0     0     0     0     0     0
  [4,]     0     0     0     0     0     0     0
  [5,]     0     0     0     0     0     0     0
  [6,]     0     0     0     0     0     0     0
  [7,]     0     0     0     0     0     0     0
  [8,]     0     0     0     0     0     0     0
  [9,]     0     0     0     0     0     0     0
 [10,]     0     0     0     0     0     0     0
 [11,]     0     0     0     0     0     0     0
 [12,]     0     0     0     0     0     0     0
 [13,]     0     0     0     0     0     0     0
 [14,]     0     0     0     0     0     0     0
 [15,]     0     0     0     0     0     0     0
 [16,]     0     0     0     0     0     0     0
 [17,]     0     0     0     0     0     0     0
 [18,]     0     0     0     0     0     0     0
 [19,]     0     0     0     0     0     0     0
 [20,]     0     0     0     0     0     0     0
 [21,]     0     0     0     0     0     0     0
 [22,]     0     0     0     0     0     0     0
 [23,]     0     0     0     0     0     0     0
 [24,]     0     0     0     0     0     0     0
 [25,]     0     0     0     0     0     0     0
 [26,]     0     0     0     0     0     0     0
 [27,]     0     0     0     0     0     0     0
 [28,]     0     0     0     0     0     0     0
 [29,]     0     0     0     0     0     0     0
 [30,]     0     0     0     0     0     0     0
 [31,]     0     0     0     0     0     0     0
 [32,]     0     0     0     0     0     0     0
 [33,]     0     0     0     0     0     0     0
 [34,]     0     0     0     0     0     0     0
 [35,]     0     0     0     0     0     0     0
 [36,]     0     0     0     0     0     0     0
 [37,]     0     1     0     0     0     0     0
 [38,]     0     0     0     0     0     0     0
 [39,]     0     0     0     0     0     0     0
 [40,]     0     0     0     0     0     0     0
 [41,]     0     0     0     0     0     0     0
 [42,]     0     0     0     0     0     0     0
 [43,]     0     0     0     0     0     0     0
 [44,]     0     0     0     0     0     0     0
 [45,]     0     0     0     0     0     0     0
 [46,]     0     0     0     0     0     0     0
 [47,]     0     0     0     0     0     0     0
 [ reached getOption("max.print") -- omitted 142 rows ]
#length(colSums(p45.newinf))
p27.incidence<-cbind(colnames(s2.p27)[7:ncol(plotnum)], (colSums(p27.newinf)))
p27.incidence<-data.frame(p27.incidence)
colnames(p27.incidence)<-c("date","newI")
p27.incidence
        date newI
1  X10.30.18    1
2   X11.9.18    0
3  X11.29.18    0
4  X12.13.18    2
5    X1.4.19    1
6   X1.18.19    2
7    X2.8.19    0
8    X3.4.19    0
9   X3.21.19    0
10  X4.11.19    0
11   X5.2.19    0
12  X5.16.19    0
13  X5.28.19    0
14  X6.13.19    0
15   X7.1.19    0
16  X7.22.19    1
17  X8.16.19    0
18  X9.17.19    0
19 X10.14.19    1
20 X11.12.19    0
21  X12.6.19    0
#now plot 28
plotnum<-s2.p28
x<-6 #start date
steps<-ncol(plotnum)-x
p28.newinf<-new_inf_corals(plotnum,steps,x)
#p28.newinf
#length(colSums(p47.newinf))
p28.incidence<-cbind(colnames(s2.p28)[7:ncol(plotnum)],(colSums(p28.newinf)))
p28.incidence<-data.frame(p28.incidence)
colnames(p28.incidence)<-c("date","newI")
#p47.incidence
plots.incidence<-cbind(p45.incidence,p47.incidence[2],p23.incidence[2],p25.incidence[2],p27.incidence[2],p28.incidence[2])
colnames(plots.incidence)<-c("date","plot45","plot47","plot23","plot25","plot27","plot28")
plots.incidence$date<-revalue(plots.incidence$date, c("X10.30.18" ="10-30-18","X11.9.18"="11-09-18","X11.29.18"="11-29-18", "X12.13.18"="12-13-18" ,"X1.4.19"="01-04-19"  , "X1.18.19" ="01-18-19","X2.8.19"="02-08-19", "X3.4.19"="03-04-19","X3.21.19"="03-21-19","X4.11.19"= "04-11-19","X5.2.19"="05-02-19","X5.16.19"="05-16-19","X5.28.19"="05-28-19","X6.13.19"="06-13-19","X7.1.19"="07-01-19","X7.22.19"="07-22-19","X8.16.19"="08-16-19","X9.17.19"="09-17-19","X10.14.19"="10-14-19","X11.12.19"="11-12-19","X12.6.19"="12-06-19"))
plots.incidence$date<-as.character(plots.incidence$date)
plots.incidence$date<-as.Date(plots.incidence$date,"%m-%d-%y")
plots.incidence
         date plot45 plot47 plot23 plot25 plot27 plot28
1  2018-10-30      0      0      0      0      1      0
2  2018-11-09      0      0      0      0      0      1
3  2018-11-29      0      0      0      1      0      1
4  2018-12-13      0      0      0      0      2      0
5  2019-01-04      0      0      4      0      1      3
6  2019-01-18      0      0      0      1      2      4
7  2019-02-08      0      2      1      0      0      1
8  2019-03-04      4      9      2      3      0      1
9  2019-03-21      3      7      0      3      0      1
10 2019-04-11     11     18      1      2      0      0
11 2019-05-02      7      9      1      2      0      0
12 2019-05-16     10     15      1      1      0      0
13 2019-05-28      2      3      1      0      0      2
14 2019-06-13      6      0      1      0      0      0
15 2019-07-01      0      2      0      1      0      0
16 2019-07-22      0      0      0      0      1      0
17 2019-08-16      0      1      0      0      0      0
18 2019-09-17      1      0      0      0      0      0
19 2019-10-14      1      1      0      0      1      0
20 2019-11-12      6      5      0      0      0      1
21 2019-12-06      2      5      1      1      0      0
plots.incidence$plot45<-as.numeric(plots.incidence$plot45)
plots.incidence$plot47<-as.numeric(plots.incidence$plot47)
plots.incidence$plot23<-as.numeric(plots.incidence$plot23)
plots.incidence$plot25<-as.numeric(plots.incidence$plot25)
plots.incidence$plot27<-as.numeric(plots.incidence$plot27)
plots.incidence$plot28<-as.numeric(plots.incidence$plot28)
incidence_long <- gather(plots.incidence, key=plot, value=newI, plot45:plot28,factor_key = TRUE)
incidence_long$newI<-as.numeric(incidence_long$newI)
plots.incidence
         date plot45 plot47 plot23 plot25 plot27 plot28
1  2018-10-30      0      0      0      0      1      0
2  2018-11-09      0      0      0      0      0      1
3  2018-11-29      0      0      0      1      0      1
4  2018-12-13      0      0      0      0      2      0
5  2019-01-04      0      0      4      0      1      3
6  2019-01-18      0      0      0      1      2      4
7  2019-02-08      0      2      1      0      0      1
8  2019-03-04      4      9      2      3      0      1
9  2019-03-21      3      7      0      3      0      1
10 2019-04-11     11     18      1      2      0      0
11 2019-05-02      7      9      1      2      0      0
12 2019-05-16     10     15      1      1      0      0
13 2019-05-28      2      3      1      0      0      2
14 2019-06-13      6      0      1      0      0      0
15 2019-07-01      0      2      0      1      0      0
16 2019-07-22      0      0      0      0      1      0
17 2019-08-16      0      1      0      0      0      0
18 2019-09-17      1      0      0      0      0      0
19 2019-10-14      1      1      0      0      1      0
20 2019-11-12      6      5      0      0      0      1
21 2019-12-06      2      5      1      1      0      0
str(incidence_long)
'data.frame':   126 obs. of  3 variables:
 $ date: Date, format: "2018-10-30" "2018-11-09" ...
 $ plot: Factor w/ 6 levels "plot45","plot47",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ newI: num  0 0 0 0 0 0 0 4 3 11 ...
ggplot(incidence_long, aes(x=date, y=newI, col=plot)) + 
  geom_path()+theme(panel.background = element_blank())+ theme(text = element_text(family = "Times New Roman"),axis.text.x = element_text(angle = 70, hjust = 1))+theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(), axis.line = element_line(colour = "black"))+labs(x="Survey Dates",y="Disease Incidence")+scale_x_date(date_breaks = "2 week", date_minor_breaks = "1 week",date_labels="%b %d")+geom_point()+scale_y_continuous(breaks=seq(0,18,2),expand = c(0, 0),limits=c(0,18.5))

tot.inc<-rowSums(plots.incidence[,2:7])
tot.inc
 [1]  1  1  2  2  8  7  4 19 14 32 19 27  8  7  3  1  1  1  3 12  9
plots.incidence$date
 [1] "2018-10-30" "2018-11-09" "2018-11-29" "2018-12-13" "2019-01-04" "2019-01-18"
 [7] "2019-02-08" "2019-03-04" "2019-03-21" "2019-04-11" "2019-05-02" "2019-05-16"
[13] "2019-05-28" "2019-06-13" "2019-07-01" "2019-07-22" "2019-08-16" "2019-09-17"
[19] "2019-10-14" "2019-11-12" "2019-12-06"
all.incidence<-data.frame("Date"=plots.incidence$date,"newInc"=tot.inc)
all.incidence
         Date newInc
1  2018-10-30      1
2  2018-11-09      1
3  2018-11-29      2
4  2018-12-13      2
5  2019-01-04      8
6  2019-01-18      7
7  2019-02-08      4
8  2019-03-04     19
9  2019-03-21     14
10 2019-04-11     32
11 2019-05-02     19
12 2019-05-16     27
13 2019-05-28      8
14 2019-06-13      7
15 2019-07-01      3
16 2019-07-22      1
17 2019-08-16      1
18 2019-09-17      1
19 2019-10-14      3
20 2019-11-12     12
21 2019-12-06      9
all.incidence$newInc.scaled<-all.incidence$newInc/300
#### all data
ggplot()+
  geom_line(data=all_filtered,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=all_filtered,mapping=aes(x=dates,y=fraction,color=state))+geom_pointrange(data=all_filtered,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  geom_bar(data=all.incidence,aes(x=Date,y=newInc.scaled),stat="identity",fill="light grey")+
  scale_y_continuous(name = "Fraction of colonies", breaks=seq(0,.2,.01),expand = c(0, 0),limits=c(0,.2),sec.axis = sec_axis(~.*300,name ="Disease incidence",breaks=c(0,5,10,15,20,25,30,35)))+
  geom_line(data=all_filtered,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=all_filtered,mapping=aes(x=dates,y=fraction,color=state))+geom_pointrange(data=all_filtered,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  theme(legend.position = "bottom")+
  theme(panel.background = element_blank())+ 
  theme(text = element_text(family = "Times New Roman"),axis.text.x = element_text(angle = 70, hjust = 1))+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(), axis.line = element_line(colour = "black"))+
  labs(x="Survey Dates",color="State")+
  scale_x_date( breaks=all_filtered$dates,date_labels="%b %d %y")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.

This is just the susceptible species disease incidence, sctld prevalence (fraction of cols with SCTLD signs), and dead colonies.

Split by site
#stats_filtered is from above, where I used the aggregate function to get mean and SE
stats_shortfiltered<-subset(stats_filtered,subset=dates>="2018-10-30")
incidence_long$site<-c(rep(3,42),rep(1,42),rep(2,42))
sites.incidence<-aggregate(newI~site+date,FUN=sum,data=incidence_long)
sites.incidence
   site       date newI
1     1 2018-10-30    0
2     2 2018-10-30    1
3     3 2018-10-30    0
4     1 2018-11-09    0
5     2 2018-11-09    1
6     3 2018-11-09    0
7     1 2018-11-29    1
8     2 2018-11-29    1
9     3 2018-11-29    0
10    1 2018-12-13    0
11    2 2018-12-13    2
12    3 2018-12-13    0
13    1 2019-01-04    4
14    2 2019-01-04    4
15    3 2019-01-04    0
16    1 2019-01-18    1
17    2 2019-01-18    6
18    3 2019-01-18    0
19    1 2019-02-08    1
20    2 2019-02-08    1
21    3 2019-02-08    2
22    1 2019-03-04    5
23    2 2019-03-04    1
24    3 2019-03-04   13
25    1 2019-03-21    3
26    2 2019-03-21    1
27    3 2019-03-21   10
28    1 2019-04-11    3
29    2 2019-04-11    0
30    3 2019-04-11   29
31    1 2019-05-02    3
32    2 2019-05-02    0
33    3 2019-05-02   16
34    1 2019-05-16    2
35    2 2019-05-16    0
36    3 2019-05-16   25
37    1 2019-05-28    1
38    2 2019-05-28    2
39    3 2019-05-28    5
40    1 2019-06-13    1
41    2 2019-06-13    0
42    3 2019-06-13    6
43    1 2019-07-01    1
44    2 2019-07-01    0
45    3 2019-07-01    2
46    1 2019-07-22    0
47    2 2019-07-22    1
48    3 2019-07-22    0
49    1 2019-08-16    0
50    2 2019-08-16    0
51    3 2019-08-16    1
52    1 2019-09-17    0
53    2 2019-09-17    0
54    3 2019-09-17    1
55    1 2019-10-14    0
56    2 2019-10-14    1
57    3 2019-10-14    2
58    1 2019-11-12    0
59    2 2019-11-12    1
60    3 2019-11-12   11
61    1 2019-12-06    2
62    2 2019-12-06    0
63    3 2019-12-06    7
str(stats_shortfiltered)
'data.frame':   126 obs. of  5 variables:
 $ state   : Factor w/ 4 levels "Healthy","SCTLD",..: 2 3 2 3 2 3 2 3 2 3 ...
 $ dates   : Date, format: "2018-10-30" "2018-10-30" ...
 $ Site    : Factor w/ 3 levels "3","1","2": 2 2 2 2 2 2 2 2 2 2 ...
 $ fraction: num  0 0.00237 0 0.00237 0.00167 ...
 $ stander : num  0 0.00237 0 0.00237 0.00167 ...
sites.incidence$newInc.scaled<-sites.incidence$newI/100
prev.data<-subset(stats_shortfiltered,subset=Site=="1")
inc.data<-subset(sites.incidence,subset=site=="1")
inc.data<-subset(inc.data,subset=date>="2018-10-30")
class(inc.data$date)
[1] "Date"
prev.data
   state      dates Site    fraction      stander
11 SCTLD 2018-10-30    1 0.000000000 0.0000000000
12  Dead 2018-10-30    1 0.002369668 0.0023696682
13 SCTLD 2018-11-09    1 0.000000000 0.0000000000
14  Dead 2018-11-09    1 0.002369668 0.0023696682
15 SCTLD 2018-11-29    1 0.001666667 0.0016666667
16  Dead 2018-11-29    1 0.002369668 0.0023696682
17 SCTLD 2018-12-13    1 0.001666667 0.0016666667
18  Dead 2018-12-13    1 0.002369668 0.0023696682
19 SCTLD 2019-01-04    1 0.011145340 0.0078120063
20  Dead 2019-01-04    1 0.002369668 0.0023696682
21 SCTLD 2019-01-18    1 0.012812006 0.0061453397
22  Dead 2019-01-18    1 0.002369668 0.0023696682
23 SCTLD 2019-02-08    1 0.015181675 0.0085150079
24  Dead 2019-02-08    1 0.002369668 0.0023696682
25 SCTLD 2019-03-04    1 0.019218009 0.0092180095
26  Dead 2019-03-04    1 0.008072670 0.0014060032
27 SCTLD 2019-03-21    1 0.012109005 0.0021090047
28  Dead 2019-03-21    1 0.020181675 0.0035150079
29 SCTLD 2019-04-11    1 0.016145340 0.0028120063
30  Dead 2019-04-11    1 0.021848341 0.0018483412
31 SCTLD 2019-05-02    1 0.012109005 0.0021090047
32  Dead 2019-05-02    1 0.031587678 0.0015876777
33 SCTLD 2019-05-16    1 0.012812006 0.0061453397
34  Dead 2019-05-16    1 0.042290679 0.0043759874
35 SCTLD 2019-05-28    1 0.010442338 0.0037756714
36  Dead 2019-05-28    1 0.047030016 0.0003633491
37 SCTLD 2019-06-13    1 0.008072670 0.0014060032
38  Dead 2019-06-13    1 0.051769352 0.0051026856
39 SCTLD 2019-07-01    1 0.007369668 0.0026303318
40  Dead 2019-07-01    1 0.054139021 0.0074723539
41 SCTLD 2019-07-22    1 0.007369668 0.0026303318
42  Dead 2019-07-22    1 0.054139021 0.0074723539
43 SCTLD 2019-08-16    1 0.007369668 0.0026303318
44  Dead 2019-08-16    1 0.054139021 0.0074723539
45 SCTLD 2019-09-17    1 0.005703002 0.0009636651
46  Dead 2019-09-17    1 0.055805687 0.0058056872
47 SCTLD 2019-10-14    1 0.001666667 0.0016666667
48  Dead 2019-10-14    1 0.058175355 0.0081753555
49 SCTLD 2019-11-12    1 0.001666667 0.0016666667
50  Dead 2019-11-12    1 0.062211690 0.0088783570
51 SCTLD 2019-12-06    1 0.005703002 0.0009636651
52  Dead 2019-12-06    1 0.072211690 0.0011216430
s1.ts<-ggplot()+
  geom_line(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_pointrange(data=prev.data,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  geom_bar(data=inc.data,aes(x=date,y=newInc.scaled),stat="identity",fill="light grey")+
  scale_y_continuous(name = "Fraction of colonies", breaks=seq(0,.1,.01),expand = c(0, 0),limits=c(0,.1),sec.axis = sec_axis(~.*100,name ="Disease incidence",breaks=c(0,2,4,6,8,10)))+
  geom_line(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+geom_pointrange(data=prev.data,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  theme(legend.position = "none")+
  theme(panel.background = element_blank())+ 
  theme(text = element_text(family = "Times New Roman"),axis.text.x =element_blank())+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(), axis.line = element_line(colour = "black"))+
  labs(x="",color="State")+
  scale_x_date( breaks=stats_filtered$dates,date_labels="")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
s1.ts

prev.data<-subset(stats_shortfiltered,subset=Site=="2")
inc.data<-subset(sites.incidence,subset=site=="2")
inc.data<-subset(inc.data,subset=date>="2018-10-30")
prev.data
    state      dates Site    fraction      stander
63  SCTLD 2018-10-30    2 0.002645503 0.0026455026
64   Dead 2018-10-30    2 0.000000000 0.0000000000
65  SCTLD 2018-11-09    2 0.002392344 0.0023923445
66   Dead 2018-11-09    2 0.002645503 0.0026455026
67  SCTLD 2018-11-29    2 0.004784689 0.0047846890
68   Dead 2018-11-29    2 0.002645503 0.0026455026
69  SCTLD 2018-12-13    2 0.010075694 0.0005063163
70   Dead 2018-12-13    2 0.002645503 0.0026455026
71  SCTLD 2019-01-04    2 0.017505886 0.0016328701
72   Dead 2019-01-04    2 0.005037847 0.0002531581
73  SCTLD 2019-01-18    2 0.027075264 0.0112022480
74   Dead 2019-01-18    2 0.017505886 0.0016328701
75  SCTLD 2019-02-08    2 0.022290575 0.0064175590
76   Dead 2019-02-08    2 0.024682919 0.0088099035
77  SCTLD 2019-03-04    2 0.009569378 0.0095693780
78   Dead 2019-03-04    2 0.039796461 0.0080504291
79  SCTLD 2019-03-21    2 0.011961722 0.0119617225
80   Dead 2019-03-21    2 0.042188805 0.0104427736
81  SCTLD 2019-04-11    2 0.007177033 0.0071770335
82   Dead 2019-04-11    2 0.046973494 0.0152274626
83  SCTLD 2019-05-02    2 0.004784689 0.0047846890
84   Dead 2019-05-02    2 0.054656844 0.0123288018
85  SCTLD 2019-05-16    2 0.004784689 0.0047846890
86   Dead 2019-05-16    2 0.054656844 0.0123288018
87  SCTLD 2019-05-28    2 0.007177033 0.0071770335
88   Dead 2019-05-28    2 0.054656844 0.0123288018
89  SCTLD 2019-06-13    2 0.004784689 0.0047846890
90   Dead 2019-06-13    2 0.057049189 0.0147211463
91  SCTLD 2019-07-01    2 0.004784689 0.0047846890
92   Dead 2019-07-01    2 0.057049189 0.0147211463
93  SCTLD 2019-07-22    2 0.007430192 0.0021391863
94   Dead 2019-07-22    2 0.057049189 0.0147211463
95  SCTLD 2019-08-16    2 0.007430192 0.0021391863
96   Dead 2019-08-16    2 0.059694691 0.0120756437
97  SCTLD 2019-09-17    2 0.004784689 0.0047846890
98   Dead 2019-09-17    2 0.072415888 0.0089238247
99  SCTLD 2019-10-14    2 0.007430192 0.0021391863
100  Dead 2019-10-14    2 0.075061391 0.0062783221
101 SCTLD 2019-11-12    2 0.009822536 0.0045315308
102  Dead 2019-11-12    2 0.075061391 0.0062783221
103 SCTLD 2019-12-06    2 0.009822536 0.0045315308
104  Dead 2019-12-06    2 0.087529430 0.0081643503
s2.ts<-ggplot()+
  geom_line(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_pointrange(data=prev.data,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  geom_bar(data=inc.data,aes(x=date,y=newInc.scaled),stat="identity",fill="light grey")+
  scale_y_continuous(name = "Fraction of colonies", breaks=seq(0,.1,.01),expand = c(0, 0),limits=c(0,.1),sec.axis = sec_axis(~.*100,name ="Disease incidence",breaks=c(0,2,4,6,8,10)))+
  geom_line(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+geom_pointrange(data=prev.data,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  theme(legend.position = "none")+
  theme(panel.background = element_blank())+ 
  theme(text = element_text(family = "Times New Roman"),axis.text.x = element_blank())+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(), axis.line = element_line(colour = "black"))+
  labs(x="",color="State")+
  scale_x_date( breaks=stats_filtered$dates,date_labels="%b %d %y")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
s2.ts

prev.data<-subset(stats_shortfiltered,subset=Site=="3")
inc.data<-subset(sites.incidence,subset=site=="3")
inc.data<-subset(inc.data,subset=date>="2018-10-30")
s3.ts<-ggplot()+
  geom_line(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_pointrange(data=prev.data,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  geom_bar(data=inc.data,aes(x=date,y=newInc.scaled),stat="identity",fill="light grey")+
  scale_y_continuous(name = "Fraction of colonies", breaks=seq(0,.3,.05),expand = c(0, 0),limits=c(0,.30),sec.axis = sec_axis(~.*100,name ="Disease incidence",breaks=c(0,5,10,15,20,25,30)))+
  geom_line(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+
  geom_point(data=prev.data,mapping=aes(x=dates,y=fraction,color=state))+geom_pointrange(data=prev.data,aes(x=dates,y=fraction,color=state,ymin=fraction-stander, ymax=fraction+stander))+
  scale_colour_manual(values=c("Healthy"="blue","SCTLD"="red","Dead"="black","Unknown"="grey"),drop=TRUE)+
  theme(legend.position = "bottom")+
  theme(panel.background = element_blank())+ 
  theme(text = element_text(family = "Times New Roman"),axis.text.x =element_blank())+
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),panel.background = element_blank(), axis.line = element_line(colour = "black"))+
  labs(x="",color="State")+
  scale_x_date( breaks=stats_filtered$dates,date_labels="")+ 
  theme(text = element_text(family = "Times New Roman"),axis.text.x = element_text(angle = 70, hjust = 1))+
  scale_x_date( breaks=stats_filtered$dates,date_labels="%d %b %y")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
Scale for 'x' is already present. Adding another scale for 'x', which will
replace the existing scale.
s3.ts

tiff("Figure2.tiff",width=180, height=300,units="mm",res=300)
(s2.ts/s1.ts/s3.ts) + plot_annotation(tag_levels="A")
dev.off()
null device 
          1 
LS0tCnRpdGxlOiAiVGVtcG9yYWwgRHluYW1pY3MgU0NUTEQgTG93ZXIgS2V5cyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyBUaGlzIG5vdGVib29rIGluY2x1ZGVzOgotIERhdGEtd3JhbmdsaW5nIGZvciB0ZW1wb3JhbCBkeW5hbWljcyB2aXN1YWxpemF0aW9uLCB1c2UgU0NUTERfRU5EX2V4dGEuY3N2Ci0gUHJvZHVjZXMgRmlndXJlIDIKCiMjIyBMb2FkIHBhY2thZ2VzIG5lZWRlZCBhbmQgZG8gaW5pdGlhbCBkYXRhIHdyYW5nbGluZwpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShhYmluZCkKbGlicmFyeShzY2lwbG90KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShwYXRjaHdvcmspCmdldHdkKCkKYGBgCgpgYGB7cn0KbXkuZGF0YTwtcmVhZC5jc3YoIlNDVExEX0VORF9leHRhLmNzdiIsIGhlYWRlcj1UKSAjc2hvcnRlbmVkIGZpbGUgd2l0aCBqdXN0IG9uZSBjb2x1bW4gcGVyIGRhdGUgd2l0aCBsZXZlbHMgb2YgCm15LmRhdGE8LW15LmRhdGFbLC1jKDM0OjM3KV0Kc3RyKG15LmRhdGEpCiNteS5kYXRhJFBsb3QKYGBgCgpHZXQgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBhbmQgZ2V0IHRoZSB0aW1lcG9pbnRzIGludG8gdGhlIHJpZ2h0IGZvcm1hdCBmb3IgcGxvdHRpbmcgdmlhIGdncGxvdC4KYGBge3J9CiNtb3ZlIHRvIGEgbG9uZyBmb3JtYXQgc28gdGhhdCBldmVyeSByb3cgaXMgbm93IGFuIG9ic2VydmF0aW9uIG9mIGEgY29sb255IGF0IGEgc2luZ2xlIHRpbWVwb2ludApkYXRhX2xvbmcgPC0gZ2F0aGVyKG15LmRhdGEsIGtleT10aW1lcHQsIHZhbHVlPXN0YXRlLCBYNS4xLjE4OlgxMi42LjE5LGZhY3Rvcl9rZXkgPSBUUlVFKQpoZWFkKGRhdGFfbG9uZykKc3VtbWFyeShhcy5mYWN0b3IoZGF0YV9sb25nJHN0YXRlKSkKI21ha2UgdGhlIGhlYWx0aCBzdGF0ZXMgZmFjdG9ycwpkYXRhX2xvbmckc3RhdGU8LWZhY3RvcihkYXRhX2xvbmckc3RhdGUsbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCgpkYXRhX2xvbmckdGltZXB0PC1yZXZhbHVlKGRhdGFfbG9uZyR0aW1lcHQsIGMoICJYNS4xLjE4Ij0iMDUtMTAtMTgiLCJYNi4xLjE4Ij0iMDYtMDEtMTgiLCJYNi4yMS4xOCI9IjA2LTIxLTE4IiwiWDcuMTYuMTgiPSIwNy0xNi0xOCIsIlg4LjE3LjE4Ij0iMDgtMTctMTgiLCJYMTAuMzAuMTgiPSIxMC0zMC0xOCIsICJYMTEuOS4xOCI9IjExLTA5LTE4IiwgIlgxMS4yOS4xOCI9IjExLTI5LTE4IiwiWDEyLjEzLjE4Ij0iMTItMTMtMTgiLCJYMS40LjE5Ij0iMDEtMDQtMTkiLCJYMS4xOC4xOSI9IjAxLTE4LTE5IiwiWDIuOC4xOSI9IjAyLTA4LTE5IiwiWDMuNC4xOSI9IjAzLTA0LTE5IiwiWDMuMjEuMTkiPSIwMy0yMS0xOSIsIlg0LjExLjE5Ij0iMDQtMTEtMTkiLCJYNS4yLjE5Ij0iMDUtMDItMTkiLCJYNS4xNi4xOSI9IjA1LTE2LTE5IiwiWDUuMjguMTkiPSIwNS0yOC0xOSIsIlg2LjEzLjE5Ij0iMDYtMTMtMTkiLCJYNy4xLjE5Ij0iMDctMDEtMTkiLCJYNy4yMi4xOSI9IjA3LTIyLTE5IiwiWDguMTYuMTkiPSIwOC0xNi0xOSIsIlg5LjE3LjE5Ij0iMDktMTctMTkiLCJYMTAuMTQuMTkiPSIxMC0xNC0xOSIsIlgxMS4xMi4xOSI9IjExLTEyLTE5IiwiWDEyLjYuMTkiPSIxMi0wNi0xOSIpKQpzdW1tYXJ5KGRhdGFfbG9uZykKCmBgYAojIyMgR3JvdXAgYnkgc3BlY2llcywgc2l0ZSwgcGxvdCwgdGltZXB0LCBhbmQgc3RhdGUKYGBge3J9CiNncm91cCBieSBzcGVjaWVzLCBzaXRlLCBwbG90LCB0aW1lcHQgYW5kIHN0YXRlCnRyeWZyZXE8LWRhdGFfbG9uZyU+JQogIGRwbHlyOjpncm91cF9ieShTcHMsU2l0ZSxQbG90LHRpbWVwdCxzdGF0ZSklPiUKICBkcGx5cjo6c3VtbWFyaXNlKG51bT1uKCkpJT4lCiAgZHBseXI6Omdyb3VwX2J5KFNwcyxTaXRlLFBsb3QsdGltZXB0KSU+JQogIGRwbHlyOjptdXRhdGUoRnJhY3Rpb249bnVtL3N1bShudW0pKQoKI3RyeWZyZXEKCgojZXhwYW5kcyB0aGUgZGF0YSBzbyB0aGF0IGFsbCBoZWFsdGggc3RhdGUgZmFjdG9ycyBhcmUgbGlzdGVkIGZvciBlYWNoIHRpbWVwb2ludCBmb3IgZWFjaCBzcGVjaWVzIGFuZCBqb2lucyBpdCB3aXRoIG9sZCB0cF9jb3VudHMuLi4gaXQgYWxzbyB0YWtlcyBhIGxvbmcgdGltZS4KdHBfY291bnRzMjwtdHJ5ZnJlcSU+JQogIGV4cGFuZChzdGF0ZSklPiUgCiAgbGVmdF9qb2luKHRyeWZyZXEpCiNwcmV2aW91cyBzdGVwIGV4cGFuZHMgaXQgYnkgbGlzdGluZyBhcyBOQSwgYW5kIG5vdyB3ZSBtYWtlIGl0IHNvIHRoYXQgTkFzIGFyZSAwcwp0cF9jb3VudHMyW2lzLm5hKHRwX2NvdW50czIpXSA8LSAwCiN0cF9jb3VudHMyCgpmcmFjczwtYXMuZGF0YS5mcmFtZSh0cF9jb3VudHMyKQpjb2xuYW1lcyhmcmFjcylbY29sbmFtZXMoZnJhY3MpPT0ibnVtIl0gPC0gIm51bV9jb2xzIgpjb2xuYW1lcyhmcmFjcylbY29sbmFtZXMoZnJhY3MpPT0iRnJhY3Rpb24iXSA8LSAiZnJhY3Rpb24iCnN1bW1hcnkoZnJhY3MpCmhlYWQoZnJhY3MpCgpgYGAKV2UganVzdCByZWFsbHkgY2FyZSBhYm91dCB0aGUgc3BlY2llcyB0aGF0IHNob3dlZCBkaXNlYXNlIHNpZ25zCmBgYHtyfQojZmlsdGVyIG91dCB0aGUgbm90IHN1c2NlcHRpYmxlIHNwZWNpZXMKZnJhY3NfZGlzX3NwczwtZnJhY3MlPiUKICBmaWx0ZXIoU3BzIT0iQUFHQSIsU3BzIT0iQUNFUiIsU3BzIT0iQVRFTiIsU3BzIT0iRUZBUyIsU3BzIT0iTUFORyIsU3BzIT0iTU1FQSIsU3BzIT0iTVlDRSIsU3BzIT0iT0NVTCIsU3BzIT0iT0RJRiIsU3BzIT0iUEFTVCIsU3BzIT0iUERJViIsU3BzIT0iUFBPUiIsU3BzIT0iU1JBRCIpJT4lCiAgZHJvcGxldmVscygpCmZyYWNzX2Rpc19zcHMkU3BzPC1hcy5mYWN0b3IoZnJhY3NfZGlzX3NwcyRTcHMpCnN0cihmcmFjc19kaXNfc3BzKQpgYGAKCiMjIyBQbG90IGVhY2ggc2l0ZSBzZXBhcmF0ZWx5IGFzIGEgbXVsdGlwYW5lbCBncmlkIG9mIHBsb3QgbnVtYmVyIChjb2xzKSBhbmQgc3BlY2llcyAocm93cykKYGBge3IsZmlnLmhlaWdodD04LGZpZy53aWR0aD02fQpmcmFjc19kaXNfc3BzJGRhdGVzPC1hcy5jaGFyYWN0ZXIoZnJhY3NfZGlzX3NwcyR0aW1lcHQpCmZyYWNzX2Rpc19zcHMkZGF0ZXM8LWFzLkRhdGUoZnJhY3NfZGlzX3NwcyRkYXRlcywiJW0tJWQtJXkiKQoKc2l0ZTE8LWZyYWNzX2Rpc19zcHMlPiUKICBmaWx0ZXIoU2l0ZT09MSxzdGF0ZSE9IlVua25vd24iKSU+JQogIGRyb3BsZXZlbHMoKQpzaXRlMSRzdGF0ZTwtZmFjdG9yKHNpdGUxJHN0YXRlLGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIikpIywiVW5rbm93biIsIlRyZWF0ZWRVbmtub3duIiwiVHJlYXRlZCIpKQpzcGVjaWVzX3RpbWU8LWdncGxvdChkYXRhPXNpdGUxLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpCnNwZWNpZXNfdGltZSsKICBnZW9tX2xpbmUoYWVzKGNvbG9yPXN0YXRlKSkrZmFjZXRfZ3JpZChTcHN+UGxvdCkrCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9c3RhdGUpKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPWVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKCJGcmFjdGlvbiBvZiBDb2xvbmllcyIsYnJlYWtzPWMoMCwwLjIsMC40LDAuNiwwLjgsMSkpKwogIHNjYWxlX3hfZGF0ZSgiU3VydmV5IERhdGVzIDIwMTgtMjAxOSIsZGF0ZV9icmVha3MgPSAiMiBtb250aHMiLGRhdGVfbGFiZWxzID0gIiVtICVkICV5IikrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiSGVhbHRoeSI9ImJsdWUiLCJTQ1RMRCI9InJlZCIsIkRlYWQiPSJibGFjayIsIlRyZWF0ZWRVbmtub3duIj0ibGlnaHRnb2xkZW5yb2QiLCJUcmVhdGVkIj0iZGFya29yYW5nZTQiLCJVbmtub3duIj0iZ3JleSIpLGxhYmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpLGRyb3A9RkFMU0UpKwogIGdndGl0bGUoIk1pZC1DaGFubmVsIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NzAsIGhqdXN0PTEpKQoKYGBgCgpgYGB7cixmaWcuaGVpZ2h0PTgsZmlnLndpZHRoPTZ9CgpzaXRlMjwtZnJhY3NfZGlzX3NwcyU+JQogIGZpbHRlcihTaXRlPT0yLHN0YXRlIT0iVW5rbm93biIpJT4lCiAgZHJvcGxldmVscygpCnNpdGUyJHN0YXRlPC1mYWN0b3Ioc2l0ZTIkc3RhdGUsbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiKSkKZ2dwbG90KGRhdGE9c2l0ZTIsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj1zdGF0ZSkpK2ZhY2V0X2dyaWQoU3BzflBsb3QpKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yPXN0YXRlKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID1lbGVtZW50X2JsYW5rKCkpKwogIHNjYWxlX3lfY29udGludW91cygiRnJhY3Rpb24gb2YgQ29sb25pZXMiLGJyZWFrcz1jKDAsMC4yLDAuNCwwLjYsMC44LDEpKSsKICBzY2FsZV94X2RhdGUoIlN1cnZleSBEYXRlcyAyMDE4LTIwMTkiLGRhdGVfYnJlYWtzID0gIjIgbW9udGhzIixkYXRlX2xhYmVscyA9ICIlbSAlZCAleSIpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIkhlYWx0aHkiPSJibHVlIiwiU0NUTEQiPSJyZWQiLCJEZWFkIj0iYmxhY2siLCJUcmVhdGVkVW5rbm93biI9ImxpZ2h0Z29sZGVucm9kIiwiVHJlYXRlZCI9ImRhcmtvcmFuZ2U0IiwiVW5rbm93biI9ImdyZXkiLCJUcmVhdGVkU0NUTEQiPSJvcmFuZ2UiKSxsYWJlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSxkcm9wPUZBTFNFKSsKICBnZ3RpdGxlKCJPZmYtU2hvcmUiKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT03MCwgaGp1c3Q9MSkpCgpgYGAKCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9Nn0KCnNpdGUzPC1mcmFjc19kaXNfc3BzJT4lCiAgZmlsdGVyKFNpdGU9PTMsc3RhdGUhPSJVbmtub3duIiklPiUKICBkcm9wbGV2ZWxzKCkKc2l0ZTMkc3RhdGU8LWZhY3RvcihzaXRlMyRzdGF0ZSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIpKQpnZ3Bsb3QoZGF0YT1zaXRlMSxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKSsKICBnZW9tX2xpbmUoYWVzKGNvbG9yPXN0YXRlKSkrZmFjZXRfZ3JpZChTcHN+UGxvdCkrCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9c3RhdGUpKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPWVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKCJGcmFjdGlvbiBvZiBDb2xvbmllcyIsYnJlYWtzPWMoMCwwLjIsMC40LDAuNiwwLjgsMSkpKwogIHNjYWxlX3hfZGF0ZSgiU3VydmV5IERhdGVzIDIwMTgtMjAxOSIsZGF0ZV9icmVha3MgPSAiMiBtb250aHMiLGRhdGVfbGFiZWxzID0gIiVtICVkICV5IikrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiSGVhbHRoeSI9ImJsdWUiLCJTQ1RMRCI9InJlZCIsIkRlYWQiPSJibGFjayIsIlRyZWF0ZWRVbmtub3duIj0ibGlnaHRnb2xkZW5yb2QiLCJUcmVhdGVkIj0iZGFya29yYW5nZTQiLCJVbmtub3duIj0iZ3JleSIsIlRyZWF0ZWRTQ1RMRCI9Im9yYW5nZSIpLGxhYmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpLGRyb3A9RkFMU0UpKwogIGdndGl0bGUoIk5lYXJzaG9yZSIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTcwLCBoanVzdD0xKSkKCmBgYAoKIyMjIE5vdyBsZXQncyAnZ3JvdXAgYnknIGRvd24gdG8gUGxvdCwgbm90IHNwZWNpZXMgYXQgZWFjaCBwbG90CgpXaXRoIG9ubHkgc3BlY2llcyB0aGF0IGdvdCBkaXNlYXNlCmBgYHtyfQojZ3JvdXAgYnkgc3BlY2llcywgc2l0ZSwgcGxvdCwgdGltZXB0IGFuZCBzdGF0ZQpkYXRhX2xvbmdfZGlzPC1kYXRhX2xvbmclPiUKICBmaWx0ZXIoU3BzIT0iQUFHQSIsU3BzIT0iQUNFUiIsU3BzIT0iQVRFTiIsU3BzIT0iRUZBUyIsU3BzIT0iTUFORyIsU3BzIT0iTU1FQSIsU3BzIT0iTVlDRSIsU3BzIT0iT0NVTCIsU3BzIT0iT0RJRiIsU3BzIT0iUEFTVCIsU3BzIT0iUERJViIsU3BzIT0iUFBPUiIsU3BzIT0iU1JBRCIpJT4lCiAgZHJvcGxldmVscygpCnRyeWZyZXFfcGxvdF9kaXM8LWRhdGFfbG9uZ19kaXMlPiUKICBkcGx5cjo6Z3JvdXBfYnkoU2l0ZSxQbG90LHRpbWVwdCxzdGF0ZSklPiUKICBkcGx5cjo6c3VtbWFyaXNlKG51bT1uKCkpJT4lCiAgZHBseXI6Omdyb3VwX2J5KFNpdGUsUGxvdCx0aW1lcHQpJT4lCiAgZHBseXI6Om11dGF0ZShGcmFjdGlvbj1udW0vc3VtKG51bSkpCgp0cnlmcmVxX3Bsb3RfZGlzCgoKI2V4cGFuZHMgdGhlIGRhdGEgc28gdGhhdCBhbGwgaGVhbHRoIHN0YXRlIGZhY3RvcnMgYXJlIGxpc3RlZCBmb3IgZWFjaCB0aW1lcG9pbnQgZm9yIGVhY2ggc3BlY2llcyBhbmQgam9pbnMgaXQgd2l0aCBvbGQgdHBfY291bnRzLi4uIGl0IGFsc28gdGFrZXMgYSBsb25nIHRpbWUuCnRwX2NvdW50czJfcGxvdF9kaXM8LXRyeWZyZXFfcGxvdF9kaXMlPiUKICBleHBhbmQoc3RhdGUpJT4lIAogIGxlZnRfam9pbih0cnlmcmVxX3Bsb3RfZGlzKQojcHJldmlvdXMgc3RlcCBleHBhbmRzIGl0IGJ5IGxpc3RpbmcgYXMgTkEsIGFuZCBub3cgd2UgbWFrZSBpdCBzbyB0aGF0IE5BcyBhcmUgMHMKdHBfY291bnRzMl9wbG90X2Rpc1tpcy5uYSh0cF9jb3VudHMyX3Bsb3RfZGlzKV0gPC0gMAp0cF9jb3VudHMyX3Bsb3RfZGlzCgpmcmFjc19wbG90X2RpczwtYXMuZGF0YS5mcmFtZSh0cF9jb3VudHMyX3Bsb3RfZGlzKQpjb2xuYW1lcyhmcmFjc19wbG90X2RpcylbY29sbmFtZXMoZnJhY3NfcGxvdF9kaXMpPT0ibnVtIl0gPC0gIm51bV9jb2xzIgpjb2xuYW1lcyhmcmFjc19wbG90X2RpcylbY29sbmFtZXMoZnJhY3NfcGxvdF9kaXMpPT0iRnJhY3Rpb24iXSA8LSAiZnJhY3Rpb24iCnN1bW1hcnkoZnJhY3NfcGxvdF9kaXMpCmhlYWQoZnJhY3NfcGxvdF9kaXMpCmZyYWNzX3Bsb3RfZGlzJGRhdGVzPC1hcy5jaGFyYWN0ZXIoZnJhY3NfcGxvdF9kaXMkdGltZXB0KQpmcmFjc19wbG90X2RpcyRkYXRlczwtYXMuRGF0ZShmcmFjc19wbG90X2RpcyRkYXRlcywiJW0tJWQtJXkiKQpgYGAKCmBgYHtyfQpzaXRlbGFiZWxzPC1jKCcxJz0iTWlkLUNoYW5uZWwiLCcyJz0iT2Zmc2hvcmUiLCczJz0iTmVhcnNob3JlIikKc2l0ZTE8LWZyYWNzX3Bsb3RfZGlzJT4lCiAgZmlsdGVyKFNpdGU9PTEpCnNwZWNpZXNfdGltZTwtZ2dwbG90KGRhdGE9c2l0ZTEsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkKc2l0ZTFwbG90PC1zcGVjaWVzX3RpbWUrCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj1zdGF0ZSkpK2ZhY2V0X2dyaWQoUGxvdH5TaXRlLGxhYmVsbGVyPWxhYmVsbGVyKFNpdGUgPSBzaXRlbGFiZWxzKSkrCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9c3RhdGUpKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPWVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKCIgIixicmVha3M9YygwLDAuMiwwLjQsMC42LDAuOCwxKSkrCiAgc2NhbGVfeF9kYXRlKCJTdXJ2ZXkgRGF0ZXMgMjAxOC0yMDE5IikrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiSGVhbHRoeSI9ImJsdWUiLCJTQ1RMRCI9InJlZCIsIkRlYWQiPSJibGFjayIsIlVua25vd24iPSJncmV5IiksZHJvcD1GQUxTRSkKCnNpdGUyPC1mcmFjc19wbG90X2RpcyU+JQogIGZpbHRlcihTaXRlPT0yKQpzcGVjaWVzX3RpbWU8LWdncGxvdChkYXRhPXNpdGUyLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpCnNpdGUycGxvdDwtc3BlY2llc190aW1lKwogIGdlb21fbGluZShhZXMoY29sb3I9c3RhdGUpKStmYWNldF9ncmlkKFBsb3R+U2l0ZSxsYWJlbGxlcj1sYWJlbGxlcihTaXRlID0gc2l0ZWxhYmVscykpKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yPXN0YXRlKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID1lbGVtZW50X2JsYW5rKCkpKwogIHNjYWxlX3lfY29udGludW91cygiICIsYnJlYWtzPWMoMCwwLjIsMC40LDAuNiwwLjgsMSkpKwogIHNjYWxlX3hfZGF0ZSgiU3VydmV5IERhdGVzIDIwMTgtMjAxOSIpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIkhlYWx0aHkiPSJibHVlIiwiU0NUTEQiPSJyZWQiLCJEZWFkIj0iYmxhY2siLCJVbmtub3duIj0iZ3JleSIpLGRyb3A9RkFMU0UpCgpzaXRlMzwtZnJhY3NfcGxvdF9kaXMlPiUKICBmaWx0ZXIoU2l0ZT09MykKc3BlY2llc190aW1lPC1nZ3Bsb3QoZGF0YT1zaXRlMyxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKQpzaXRlM3Bsb3Q8LXNwZWNpZXNfdGltZSsKICBnZW9tX2xpbmUoYWVzKGNvbG9yPXN0YXRlKSkrZmFjZXRfZ3JpZChQbG90flNpdGUsbGFiZWxsZXI9bGFiZWxsZXIoU2l0ZSA9IHNpdGVsYWJlbHMpKSsKICBnZW9tX3BvaW50KGFlcyhjb2xvcj1zdGF0ZSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9ZWxlbWVudF9ibGFuaygpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoIkZyYWN0aW9uIG9mIENvbG9uaWVzIHdpdGggU0NUTEQiLGJyZWFrcz1jKDAsMC4yLDAuNCwwLjYsMC44LDEpKSsKICBzY2FsZV94X2RhdGUoIlN1cnZleSBEYXRlcyAyMDE4LTIwMTkiKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJIZWFsdGh5Ij0iYmx1ZSIsIlNDVExEIj0icmVkIiwiRGVhZCI9ImJsYWNrIiwiVW5rbm93biI9ImdyZXkiKSxkcm9wPUZBTFNFKQoKZ2dhcnJhbmdlKHNpdGUzcGxvdCxzaXRlMXBsb3Qsc2l0ZTJwbG90LCBuY29sPTMsY29tbW9uLmxlZ2VuZD1UUlVFKQoKCmBgYAoKIyMjIEdldCBzdGF0cyAobWVhbiArLy0gU3RhbmRhcmQgZXJyb3IpIGZvciBlYWNoIHNpdGUgd2hlcmUgcGxvdHMgYXJlIHRyZWF0ZWQgYXMgcmVwbGljYXRlcwojIyMjIGZyYWN0aW9uIG9mIGNvbG9uaWVzIApgYGB7cn0KCnNpdGUubWVhbnM8LWFnZ3JlZ2F0ZShmcmFjdGlvbn5zdGF0ZStkYXRlcytTaXRlLEZVTj1tZWFuLGRhdGE9ZnJhY3NfcGxvdF9kaXMpCnNpdGUuc2U8LWFnZ3JlZ2F0ZShmcmFjdGlvbn5zdGF0ZStkYXRlcytTaXRlLEZVTj1mdW5jdGlvbih4KSBzZCh4KS9zcXJ0KGxlbmd0aCh4KSksZGF0YT1mcmFjc19wbG90X2RpcykKI3NpdGUuc2UKCnN0YXRzPC1jYmluZChzaXRlLm1lYW5zLHN0YW5kZXI9c2l0ZS5zZSRmcmFjdGlvbikKCiNzaXRlbGFiZWxzCnN0YXRzJFNpdGU8LWFzLmZhY3RvcihzdGF0cyRTaXRlKQpsZXZlbHMoc3RhdHMkU2l0ZSkKc3RhdHMkU2l0ZSA8LSBmYWN0b3Ioc3RhdHMkU2l0ZSxsZXZlbHMoc3RhdHMkU2l0ZSlbYygzLDEsMildKQoKI2p1c3QgbG9vayBhdCBkaXNlYXNlZCBhbmQgZGVhZApzdGF0c19maWx0ZXJlZDwtc3RhdHMlPiUKICBmaWx0ZXIoc3RhdGUhPSJVbmtub3duIixzdGF0ZSE9IkhlYWx0aHkiKQoKZ2dwbG90KGRhdGE9c3RhdHNfZmlsdGVyZWQsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj1zdGF0ZSkpK2ZhY2V0X3dyYXAoflNpdGUsbnJvdz0zLGxhYmVsbGVyPWxhYmVsbGVyKFNpdGUgPSBzaXRlbGFiZWxzKSkrCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9c3RhdGUpKStnZW9tX3BvaW50cmFuZ2UoYWVzKGNvbG9yPXN0YXRlLHltaW49ZnJhY3Rpb24tMS45NipzdGFuZGVyLCB5bWF4PWZyYWN0aW9uKzEuOTYqc3RhbmRlcikpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9ZWxlbWVudF9ibGFuaygpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoIkZyYWN0aW9uIG9mIENvbG9uaWVzIHdpdGggU0NUTEQiLGMoMCwwLjIpLGJyZWFrcz1jKDAsMC4wNSwwLjEsMC4xNSwwLjIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJIZWFsdGh5Ij0iYmx1ZSIsIlNDVExEIj0icmVkIiwiRGVhZCI9ImJsYWNrIiksZHJvcD1UUlVFKSsKICAjZ2d0aXRsZSgiRGlzZWFzZSBQcmV2YWxlbmNlIChhbGwgc3VydmV5ZWQgY29yYWxzKSIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTcwLCBoanVzdD0xKSkrc2NhbGVfeF9kYXRlKCJTdXJ2ZXkgRGF0ZXMgMjAxOC0yMDE5IiwgYnJlYWtzPXN0YXRzJGRhdGVzLGRhdGVfbGFiZWxzPSIlYiAlZCAleSIpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgoKYGBgCgojIyMjIGFsbCBkYXRhIHRlbXBvcmFsIGR5bmFtaWNzCmBgYHtyfQojc2l0ZXMgKGF2ZXJhZ2VkIHBsb3RzKSBhcmUgcmVwbGljYXRlcwoKYWxsLm1lYW5zPC1hZ2dyZWdhdGUoZnJhY3Rpb25+c3RhdGUrZGF0ZXMsRlVOPW1lYW4sZGF0YT1zaXRlLm1lYW5zKQphbGwuc2U8LWFnZ3JlZ2F0ZShmcmFjdGlvbn5zdGF0ZStkYXRlcyxGVU49ZnVuY3Rpb24oeCkgc2QoeCkvc3FydChsZW5ndGgoeCkpLGRhdGE9c2l0ZS5tZWFucykKYWxsLnN0YXRzPC1jYmluZChhbGwubWVhbnMsc3RhbmRlcj1hbGwuc2UkZnJhY3Rpb24pCiNhbGwuc3RhdHMKCiNhbGxfZmlsdGVyZWQ8LWFsbC5zdGF0cyU+JQogIyBmaWx0ZXIoc3RhdGUhPSJVbmtub3duIikKCiMjIyB5b3UgaGF2ZSB0byBwbGF5IHdpdGggdGhpcyBiaXQgdG8gZ2V0IGl0IGluIHRoZSByaWdodCBvcmRlcgojc3RhdHNfZmlsdGVyZWQkU2l0ZSA8LSBmYWN0b3Ioc3RhdHNfZmlsdGVyZWQkU2l0ZSxsZXZlbHMoc3RhdHNfZmlsdGVyZWQkU2l0ZSlbYygzLDIsMSldKQojbGV2ZWxzKHN0YXRzX2ZpbHRlcmVkJFNpdGUpCiNzaXRlbGFiZWxzCgpzcGVjaWVzX3RpbWU8LWdncGxvdChkYXRhPWFsbC5zdGF0cyxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKQpzcGVjaWVzX3RpbWUrCiAgZ2VvbV9saW5lKGFlcyhjb2xvcj1zdGF0ZSkpKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yPXN0YXRlKSkrZ2VvbV9wb2ludHJhbmdlKGFlcyhjb2xvcj1zdGF0ZSx5bWluPWZyYWN0aW9uLTEuOTYqc3RhbmRlciwgeW1heD1mcmFjdGlvbisxLjk2KnN0YW5kZXIpKSsKICB0aGVtZV9idygpKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPWVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKCJGcmFjdGlvbiBvZiBDb2xvbmllcyB3aXRoIFNDVExEIixjKDAuMSwxKSxicmVha3M9YygwLjEsMC4yLDAuNCwwLjYsMC44LDEpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJIZWFsdGh5Ij0iYmx1ZSIsIlNDVExEIj0icmVkIiwiRGVhZCI9ImJsYWNrIiwiVW5rbm93biI9ImdyZXkiKSxkcm9wPVRSVUUpKwogICNnZ3RpdGxlKCJEaXNlYXNlIFByZXZhbGVuY2UgKGFsbCBzdXJ2ZXllZCBjb3JhbHMpIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NzAsIGhqdXN0PTEpKStzY2FsZV94X2RhdGUoIlN1cnZleSBEYXRlcyAyMDE4LTIwMTkiLCBicmVha3M9YWxsLnN0YXRzJGRhdGVzLGRhdGVfbGFiZWxzPSIlYiAlZCAleSIpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQoKCmBgYAojIyMjIGJsb3cgdXAgdG8gZGlzIGFuZCBkZWFkLCBmcmFjdGlvbiBjb2xvbmllcwpgYGB7cn0KCmFsbF9maWx0ZXJlZDwtYWxsLnN0YXRzJT4lCiAgZmlsdGVyKHN0YXRlIT0iSGVhbHRoeSIsc3RhdGUhPSJVbmtub3duIikKCnNwZWNpZXNfdGltZTwtZ2dwbG90KGRhdGE9YWxsX2ZpbHRlcmVkLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpCnNwZWNpZXNfdGltZSsKICBnZW9tX2xpbmUoYWVzKGNvbG9yPXN0YXRlKSkrCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9c3RhdGUpKStnZW9tX3BvaW50cmFuZ2UoYWVzKGNvbG9yPXN0YXRlLHltaW49ZnJhY3Rpb24tc3RhbmRlciwgeW1heD1mcmFjdGlvbitzdGFuZGVyKSkrCiAgdGhlbWVfYncoKSsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID1lbGVtZW50X2JsYW5rKCkpKwogIHNjYWxlX3lfY29udGludW91cygiRnJhY3Rpb24gb2YgY29sb25pZXMiLGMoMCwwLjIpLGJyZWFrcz1jKDAsMC4wNSwwLjEsMC4xNSwwLjIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJIZWFsdGh5Ij0iYmx1ZSIsIlNDVExEIj0icmVkIiwiRGVhZCI9ImJsYWNrIiwiVW5rbm93biI9ImdyZXkiKSxkcm9wPVRSVUUpKwogICNnZ3RpdGxlKCJEaXNlYXNlIFByZXZhbGVuY2UgKGFsbCBzdXJ2ZXllZCBjb3JhbHMpIikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NzAsIGhqdXN0PTEpKStzY2FsZV94X2RhdGUoIlN1cnZleSBEYXRlcyAyMDE4LTIwMTkiLCBicmVha3M9YWxsLnN0YXRzJGRhdGVzLGRhdGVfbGFiZWxzPSIlYiAlZCAleSIpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQoKYGBgCgojIyMgTm93IHdpdGggaW5jaWRlbmNlCgpuZWVkIHRoZSBuZXdfaW5mX2NvcmFscyBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG5ld2x5IGRpc2Vhc2VkIGNvcmFscwpgYGB7cn0KbmV3X2luZl9jb3JhbHM8LWZ1bmN0aW9uKGRmLHN0ZXBzLHgpewogICMjIG5ld2x5X0kKICBuZXdseV9JPC1tYXRyaXgoMCwgbnJvdyA9IG5yb3coZGYpLCBuY29sID0gc3RlcHMpICNibGFuayBtYXRyaXggZm9yIHN0b3JpbmcgbmV3bHkgaW5mZWN0ZWQgY29yYWxzCiAgI25ld2x5X0kKICBmb3IgKGkgaW4gMTpzdGVwcyl7ICNmb3IgZWFjaCBzdXJ2ZXkgdGltZSBwb2ludAogICAgY29sPC14K2kgI3N0YXJ0IHdpdGggZmlyc3QgdHAgYWZ0ZXIgaW5pdCB0cAogICAgcHJldjwteCtpLTEKICAgIGZvciAoaiBpbiAxOihucm93KGRmKSkpeyAjZm9yIGVhY2ggcm93IGluIHRoZSBkZgogICAgICAjcHJpbnQgKGRmW2osY29sXSkKICAgICAgaWYgKCBkZltqLGNvbF09PSJTQ1RMRCIgKXsgI2lmIGl0J3MgZGlzZWFzZQogICAgICAgICNwcmludCggImZvdW5kIG9uZSIpCiAgICAgICAgaWYgKGRmW2oscHJldl0hPSJTQ1RMRCIpeyAjIGFuZCBpZiBpdCB3YXNudCBkaXNlYXNlZCBiZWZvcmUKICAgICAgICAgIG5ld2x5X0lbaixpXTwtMSAjYWRkIGl0IHRvIG5ld2x5IGluZmVjdGVkCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybihuZXdseV9JKQp9CmBgYAoKYGBge3J9CiNuZWVkIGp1c3Qgc3VzY3BldGlibGUgc3BlY2llcwpkaXMuc3BzPC1teS5kYXRhJT4lCiAgZmlsdGVyKFNwcyE9IkFBR0EiLFNwcyE9IkFDRVIiLFNwcyE9IkFURU4iLFNwcyE9IkVGQVMiLFNwcyE9Ik1BTkciLFNwcyE9Ik1NRUEiLFNwcyE9Ik1ZQ0UiLFNwcyE9Ik9DVUwiLFNwcyE9Ik9ESUYiLFNwcyE9IlBBU1QiLFNwcyE9IlBESVYiLFNwcyE9IlBQT1IiLFNwcyE9IlNSQUQiKSU+JQogIGRyb3BsZXZlbHMoKQpgYGAKCmBgYHtyfQojb2ssIHNob3J0ZW4gZGlzLnNwcyBkYXRhc2V0IHRvIGp1c3QgMTAvMzAvMTktMTIvNi8xOSwgYmVjdWFzZSBkaWRudCBzZWUgZGlzZWFzZSB1bnRpbCB0aGVuCiMjIHRoaXMgaXMgdGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQKI2NvbG5hbWVzKGRpcy5zcHMpCm15LmRhdGFzPC1kaXMuc3BzJT4lCiAgZHBseXI6OnNlbGVjdChTaXRlLFBsb3QsU3BzLGNvb3Jkc194LGNvb3Jkc195LFg4LjE3LjE4LFgxMC4zMC4xOCxYMTEuOS4xOCxYMTEuMjkuMTgsWDEyLjEzLjE4LFgxLjQuMTksWDEuMTguMTksWDIuOC4xOSxYMy40LjE5LFgzLjIxLjE5LFg0LjExLjE5LFg1LjIuMTksWDUuMTYuMTksWDUuMjguMTksWDYuMTMuMTksWDcuMS4xOSxYNy4yMi4xOSxYOC4xNi4xOSxYOS4xNy4xOSxYMTAuMTQuMTksWDExLjEyLjE5LFgxMi42LjE5KQpjb2xuYW1lcyhkaXMuc3BzKQojcmVmYWN0b3IgZGF0YSB0byBhbGwgaGF2ZSBzYW1lIGxldmVscwpteS5kYXRhcyRYOC4xNy4xODwtZmFjdG9yKG15LmRhdGFzJFg4LjE3LjE4LGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpKQpteS5kYXRhcyRYMTAuMzAuMTg8LWZhY3RvcihteS5kYXRhcyRYMTAuMzAuMTgsbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCm15LmRhdGFzJFgxMS45LjE4PC1mYWN0b3IobXkuZGF0YXMkWDExLjkuMTgsbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCm15LmRhdGFzJFgxMS4yOS4xODwtZmFjdG9yKG15LmRhdGFzJFgxMS4yOS4xOCxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKbXkuZGF0YXMkWDEyLjEzLjE4PC1mYWN0b3IobXkuZGF0YXMkWDEyLjEzLjE4LGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpKQpteS5kYXRhcyRYMS40LjE5PC1mYWN0b3IobXkuZGF0YXMkWDEuNC4xOSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKbXkuZGF0YXMkWDEuMTguMTk8LWZhY3RvcihteS5kYXRhcyRYMS4xOC4xOSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKCm15LmRhdGFzJFgyLjguMTk8LWZhY3RvcihteS5kYXRhcyRYMi44LjE5LGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpKQpteS5kYXRhcyRYMy40LjE5PC1mYWN0b3IobXkuZGF0YXMkWDMuNC4xOSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKbXkuZGF0YXMkWDMuMjEuMTk8LWZhY3RvcihteS5kYXRhcyRYMy4yMS4xOSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKbXkuZGF0YXMkWDQuMTEuMTk8LWZhY3RvcihteS5kYXRhcyRYNC4xMS4xOSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKbXkuZGF0YXMkWDUuMi4xOTwtZmFjdG9yKG15LmRhdGFzJFg1LjIuMTksbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCm15LmRhdGFzJFg1LjE2LjE5PC1mYWN0b3IobXkuZGF0YXMkWDUuMTYuMTksbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCm15LmRhdGFzJFg1LjI4LjE5PC1mYWN0b3IobXkuZGF0YXMkWDUuMjguMTksbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCm15LmRhdGFzJFg2LjEzLjE5PC1mYWN0b3IobXkuZGF0YXMkWDYuMTMuMTksbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCm15LmRhdGFzJFg3LjEuMTk8LWZhY3RvcihteS5kYXRhcyRYNy4xLjE5LGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpKQpteS5kYXRhcyRYNy4yMi4xOTwtZmFjdG9yKG15LmRhdGFzJFg3LjIyLjE5LGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpKQpteS5kYXRhcyRYOC4xNi4xOTwtZmFjdG9yKG15LmRhdGFzJFg4LjE2LjE5LGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpKQpteS5kYXRhcyRYOS4xNy4xOTwtZmFjdG9yKG15LmRhdGFzJFg5LjE3LjE5LGxldmVscz1jKCJIZWFsdGh5IiwiU0NUTEQiLCJEZWFkIiwiVW5rbm93biIpKQpteS5kYXRhcyRYMTAuMTQuMTk8LWZhY3RvcihteS5kYXRhcyRYMTAuMTQuMTksbGV2ZWxzPWMoIkhlYWx0aHkiLCJTQ1RMRCIsIkRlYWQiLCJVbmtub3duIikpCm15LmRhdGFzJFgxMS4xMi4xOTwtZmFjdG9yKG15LmRhdGFzJFgxMS4xMi4xOSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKbXkuZGF0YXMkWDEyLjYuMTk8LWZhY3RvcihteS5kYXRhcyRYMTIuNi4xOSxsZXZlbHM9YygiSGVhbHRoeSIsIlNDVExEIiwiRGVhZCIsIlVua25vd24iKSkKCmhlYWQobXkuZGF0YXMpCmBgYAoKYGBge3J9CiNTcGxpdCBpbnRvIHBsb3RzIGZvciBhbmFseXNpcwpzMy5wNDU8LW15LmRhdGFzJT4lCiAgZmlsdGVyKFBsb3Q9PTQ1KQpzMy5wNDc8LW15LmRhdGFzJT4lCiAgZmlsdGVyKFBsb3Q9PTQ3KQoKczEucDIzPC1teS5kYXRhcyU+JQogIGZpbHRlcihQbG90PT0yMykKczEucDI1PC1teS5kYXRhcyU+JQogIGZpbHRlcihQbG90PT0yNSkKCnMyLnAyNzwtbXkuZGF0YXMlPiUKICBmaWx0ZXIoUGxvdD09MjcpCnMyLnAyODwtbXkuZGF0YXMlPiUKICBmaWx0ZXIoUGxvdD09MjgpCgpgYGAKIyMjIyBJbmNpZGVuY2UgUmF0ZXMgCmBgYHtyfQpwbG90bnVtPC1zMy5wNDUKczMucDQ1Cng8LTYgI3N0YXJ0IGRhdGUKc3RlcHM8LW5jb2wocGxvdG51bSkteCAKc3RlcHMKcDQ1Lm5ld2luZjwtbmV3X2luZl9jb3JhbHMocGxvdG51bSxzdGVwcyx4KQpjb2xTdW1zKHA0NS5uZXdpbmYpCiNsZW5ndGgoY29sU3VtcyhwNDUubmV3aW5mKSkKCnA0NS5pbmNpZGVuY2U8LWNiaW5kKGNvbG5hbWVzKHMzLnA0NSlbNzpuY29sKHBsb3RudW0pXSwgKGNvbFN1bXMocDQ1Lm5ld2luZikpKQpwNDUuaW5jaWRlbmNlPC1kYXRhLmZyYW1lKHA0NS5pbmNpZGVuY2UpCmNvbG5hbWVzKHA0NS5pbmNpZGVuY2UpPC1jKCJkYXRlIiwibmV3SSIpCnA0NS5pbmNpZGVuY2UKCiNub3cgcGxvdCA0NwpwbG90bnVtPC1zMy5wNDcKeDwtNiAjc3RhcnQgZGF0ZQpzdGVwczwtbmNvbChwbG90bnVtKS14CnA0Ny5uZXdpbmY8LW5ld19pbmZfY29yYWxzKHBsb3RudW0sc3RlcHMseCkKI3A0Ny5uZXdpbmYKI2xlbmd0aChjb2xTdW1zKHA0Ny5uZXdpbmYpKQpwNDcuaW5jaWRlbmNlPC1jYmluZChjb2xuYW1lcyhzMy5wNDcpWzc6bmNvbChwbG90bnVtKV0sKGNvbFN1bXMocDQ3Lm5ld2luZikpKQpwNDcuaW5jaWRlbmNlPC1kYXRhLmZyYW1lKHA0Ny5pbmNpZGVuY2UpCmNvbG5hbWVzKHA0Ny5pbmNpZGVuY2UpPC1jKCJkYXRlIiwibmV3SSIpCiNwNDcuaW5jaWRlbmNlCgpwbG90bnVtPC1zMS5wMjMKeDwtNiAjc3RhcnQgZGF0ZQpzdGVwczwtbmNvbChwbG90bnVtKS14IApzdGVwcwpwMjMubmV3aW5mPC1uZXdfaW5mX2NvcmFscyhwbG90bnVtLHN0ZXBzLHgpCnAyMy5uZXdpbmYKI2xlbmd0aChjb2xTdW1zKHA0NS5uZXdpbmYpKQoKcDIzLmluY2lkZW5jZTwtY2JpbmQoY29sbmFtZXMoczEucDIzKVs3Om5jb2wocGxvdG51bSldLCAoY29sU3VtcyhwMjMubmV3aW5mKSkpCnAyMy5pbmNpZGVuY2U8LWRhdGEuZnJhbWUocDIzLmluY2lkZW5jZSkKY29sbmFtZXMocDIzLmluY2lkZW5jZSk8LWMoImRhdGUiLCJuZXdJIikKcDIzLmluY2lkZW5jZQoKI25vdyBwbG90IDI1CnBsb3RudW08LXMxLnAyNQp4PC02ICNzdGFydCBkYXRlCnN0ZXBzPC1uY29sKHBsb3RudW0pLXgKcDI1Lm5ld2luZjwtbmV3X2luZl9jb3JhbHMocGxvdG51bSxzdGVwcyx4KQojcDQ3Lm5ld2luZgojbGVuZ3RoKGNvbFN1bXMocDQ3Lm5ld2luZikpCnAyNS5pbmNpZGVuY2U8LWNiaW5kKGNvbG5hbWVzKHMxLnAyNSlbNzpuY29sKHBsb3RudW0pXSwoY29sU3VtcyhwMjUubmV3aW5mKSkpCnAyNS5pbmNpZGVuY2U8LWRhdGEuZnJhbWUocDI1LmluY2lkZW5jZSkKY29sbmFtZXMocDI1LmluY2lkZW5jZSk8LWMoImRhdGUiLCJuZXdJIikKI3A0Ny5pbmNpZGVuY2UKCnBsb3RudW08LXMyLnAyNwoKeDwtNiAjc3RhcnQgZGF0ZQpzdGVwczwtbmNvbChwbG90bnVtKS14IApzdGVwcwpwMjcubmV3aW5mPC1uZXdfaW5mX2NvcmFscyhwbG90bnVtLHN0ZXBzLHgpCnAyNy5uZXdpbmYKI2xlbmd0aChjb2xTdW1zKHA0NS5uZXdpbmYpKQoKcDI3LmluY2lkZW5jZTwtY2JpbmQoY29sbmFtZXMoczIucDI3KVs3Om5jb2wocGxvdG51bSldLCAoY29sU3VtcyhwMjcubmV3aW5mKSkpCnAyNy5pbmNpZGVuY2U8LWRhdGEuZnJhbWUocDI3LmluY2lkZW5jZSkKY29sbmFtZXMocDI3LmluY2lkZW5jZSk8LWMoImRhdGUiLCJuZXdJIikKcDI3LmluY2lkZW5jZQoKI25vdyBwbG90IDI4CnBsb3RudW08LXMyLnAyOAp4PC02ICNzdGFydCBkYXRlCnN0ZXBzPC1uY29sKHBsb3RudW0pLXgKcDI4Lm5ld2luZjwtbmV3X2luZl9jb3JhbHMocGxvdG51bSxzdGVwcyx4KQojcDI4Lm5ld2luZgojbGVuZ3RoKGNvbFN1bXMocDQ3Lm5ld2luZikpCnAyOC5pbmNpZGVuY2U8LWNiaW5kKGNvbG5hbWVzKHMyLnAyOClbNzpuY29sKHBsb3RudW0pXSwoY29sU3VtcyhwMjgubmV3aW5mKSkpCnAyOC5pbmNpZGVuY2U8LWRhdGEuZnJhbWUocDI4LmluY2lkZW5jZSkKY29sbmFtZXMocDI4LmluY2lkZW5jZSk8LWMoImRhdGUiLCJuZXdJIikKI3A0Ny5pbmNpZGVuY2UKCgpwbG90cy5pbmNpZGVuY2U8LWNiaW5kKHA0NS5pbmNpZGVuY2UscDQ3LmluY2lkZW5jZVsyXSxwMjMuaW5jaWRlbmNlWzJdLHAyNS5pbmNpZGVuY2VbMl0scDI3LmluY2lkZW5jZVsyXSxwMjguaW5jaWRlbmNlWzJdKQpjb2xuYW1lcyhwbG90cy5pbmNpZGVuY2UpPC1jKCJkYXRlIiwicGxvdDQ1IiwicGxvdDQ3IiwicGxvdDIzIiwicGxvdDI1IiwicGxvdDI3IiwicGxvdDI4IikKcGxvdHMuaW5jaWRlbmNlJGRhdGU8LXJldmFsdWUocGxvdHMuaW5jaWRlbmNlJGRhdGUsIGMoIlgxMC4zMC4xOCIgPSIxMC0zMC0xOCIsIlgxMS45LjE4Ij0iMTEtMDktMTgiLCJYMTEuMjkuMTgiPSIxMS0yOS0xOCIsICJYMTIuMTMuMTgiPSIxMi0xMy0xOCIgLCJYMS40LjE5Ij0iMDEtMDQtMTkiICAsICJYMS4xOC4xOSIgPSIwMS0xOC0xOSIsIlgyLjguMTkiPSIwMi0wOC0xOSIsICJYMy40LjE5Ij0iMDMtMDQtMTkiLCJYMy4yMS4xOSI9IjAzLTIxLTE5IiwiWDQuMTEuMTkiPSAiMDQtMTEtMTkiLCJYNS4yLjE5Ij0iMDUtMDItMTkiLCJYNS4xNi4xOSI9IjA1LTE2LTE5IiwiWDUuMjguMTkiPSIwNS0yOC0xOSIsIlg2LjEzLjE5Ij0iMDYtMTMtMTkiLCJYNy4xLjE5Ij0iMDctMDEtMTkiLCJYNy4yMi4xOSI9IjA3LTIyLTE5IiwiWDguMTYuMTkiPSIwOC0xNi0xOSIsIlg5LjE3LjE5Ij0iMDktMTctMTkiLCJYMTAuMTQuMTkiPSIxMC0xNC0xOSIsIlgxMS4xMi4xOSI9IjExLTEyLTE5IiwiWDEyLjYuMTkiPSIxMi0wNi0xOSIpKQoKcGxvdHMuaW5jaWRlbmNlJGRhdGU8LWFzLmNoYXJhY3RlcihwbG90cy5pbmNpZGVuY2UkZGF0ZSkKcGxvdHMuaW5jaWRlbmNlJGRhdGU8LWFzLkRhdGUocGxvdHMuaW5jaWRlbmNlJGRhdGUsIiVtLSVkLSV5IikKcGxvdHMuaW5jaWRlbmNlCnBsb3RzLmluY2lkZW5jZSRwbG90NDU8LWFzLm51bWVyaWMocGxvdHMuaW5jaWRlbmNlJHBsb3Q0NSkKcGxvdHMuaW5jaWRlbmNlJHBsb3Q0NzwtYXMubnVtZXJpYyhwbG90cy5pbmNpZGVuY2UkcGxvdDQ3KQpwbG90cy5pbmNpZGVuY2UkcGxvdDIzPC1hcy5udW1lcmljKHBsb3RzLmluY2lkZW5jZSRwbG90MjMpCnBsb3RzLmluY2lkZW5jZSRwbG90MjU8LWFzLm51bWVyaWMocGxvdHMuaW5jaWRlbmNlJHBsb3QyNSkKcGxvdHMuaW5jaWRlbmNlJHBsb3QyNzwtYXMubnVtZXJpYyhwbG90cy5pbmNpZGVuY2UkcGxvdDI3KQpwbG90cy5pbmNpZGVuY2UkcGxvdDI4PC1hcy5udW1lcmljKHBsb3RzLmluY2lkZW5jZSRwbG90MjgpCgppbmNpZGVuY2VfbG9uZyA8LSBnYXRoZXIocGxvdHMuaW5jaWRlbmNlLCBrZXk9cGxvdCwgdmFsdWU9bmV3SSwgcGxvdDQ1OnBsb3QyOCxmYWN0b3Jfa2V5ID0gVFJVRSkKaW5jaWRlbmNlX2xvbmckbmV3STwtYXMubnVtZXJpYyhpbmNpZGVuY2VfbG9uZyRuZXdJKQoKcGxvdHMuaW5jaWRlbmNlCnN0cihpbmNpZGVuY2VfbG9uZykKZ2dwbG90KGluY2lkZW5jZV9sb25nLCBhZXMoeD1kYXRlLCB5PW5ld0ksIGNvbD1wbG90KSkgKyAKICBnZW9tX3BhdGgoKSt0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiVGltZXMgTmV3IFJvbWFuIiksYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3MCwgaGp1c3QgPSAxKSkrdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpK2xhYnMoeD0iU3VydmV5IERhdGVzIix5PSJEaXNlYXNlIEluY2lkZW5jZSIpK3NjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIyIHdlZWsiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHdlZWsiLGRhdGVfbGFiZWxzPSIlYiAlZCIpK2dlb21fcG9pbnQoKStzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDE4LDIpLGV4cGFuZCA9IGMoMCwgMCksbGltaXRzPWMoMCwxOC41KSkKYGBgCgpgYGB7cn0KdG90LmluYzwtcm93U3VtcyhwbG90cy5pbmNpZGVuY2VbLDI6N10pCnRvdC5pbmMKcGxvdHMuaW5jaWRlbmNlJGRhdGUKYWxsLmluY2lkZW5jZTwtZGF0YS5mcmFtZSgiRGF0ZSI9cGxvdHMuaW5jaWRlbmNlJGRhdGUsIm5ld0luYyI9dG90LmluYykKYWxsLmluY2lkZW5jZQphbGwuaW5jaWRlbmNlJG5ld0luYy5zY2FsZWQ8LWFsbC5pbmNpZGVuY2UkbmV3SW5jLzMwMApgYGAKCgpgYGB7cn0KIyMjIyBhbGwgZGF0YQoKZ2dwbG90KCkrCiAgZ2VvbV9saW5lKGRhdGE9YWxsX2ZpbHRlcmVkLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpKwogIGdlb21fcG9pbnQoZGF0YT1hbGxfZmlsdGVyZWQsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrZ2VvbV9wb2ludHJhbmdlKGRhdGE9YWxsX2ZpbHRlcmVkLGFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUseW1pbj1mcmFjdGlvbi1zdGFuZGVyLCB5bWF4PWZyYWN0aW9uK3N0YW5kZXIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJIZWFsdGh5Ij0iYmx1ZSIsIlNDVExEIj0icmVkIiwiRGVhZCI9ImJsYWNrIiwiVW5rbm93biI9ImdyZXkiKSxkcm9wPVRSVUUpKwogIGdlb21fYmFyKGRhdGE9YWxsLmluY2lkZW5jZSxhZXMoeD1EYXRlLHk9bmV3SW5jLnNjYWxlZCksc3RhdD0iaWRlbnRpdHkiLGZpbGw9ImxpZ2h0IGdyZXkiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJGcmFjdGlvbiBvZiBjb2xvbmllcyIsIGJyZWFrcz1zZXEoMCwuMiwuMDEpLGV4cGFuZCA9IGMoMCwgMCksbGltaXRzPWMoMCwuMiksc2VjLmF4aXMgPSBzZWNfYXhpcyh+LiozMDAsbmFtZSA9IkRpc2Vhc2UgaW5jaWRlbmNlIixicmVha3M9YygwLDUsMTAsMTUsMjAsMjUsMzAsMzUpKSkrCiAgZ2VvbV9saW5lKGRhdGE9YWxsX2ZpbHRlcmVkLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpKwogIGdlb21fcG9pbnQoZGF0YT1hbGxfZmlsdGVyZWQsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrZ2VvbV9wb2ludHJhbmdlKGRhdGE9YWxsX2ZpbHRlcmVkLGFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUseW1pbj1mcmFjdGlvbi1zdGFuZGVyLCB5bWF4PWZyYWN0aW9uK3N0YW5kZXIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJIZWFsdGh5Ij0iYmx1ZSIsIlNDVExEIj0icmVkIiwiRGVhZCI9ImJsYWNrIiwiVW5rbm93biI9ImdyZXkiKSxkcm9wPVRSVUUpKwoKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlRpbWVzIE5ldyBSb21hbiIpLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzAsIGhqdXN0ID0gMSkpKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSsKICBsYWJzKHg9IlN1cnZleSBEYXRlcyIsY29sb3I9IlN0YXRlIikrCiAgc2NhbGVfeF9kYXRlKCBicmVha3M9YWxsX2ZpbHRlcmVkJGRhdGVzLGRhdGVfbGFiZWxzPSIlYiAlZCAleSIpCgpgYGAKVGhpcyBpcyBqdXN0IHRoZSBzdXNjZXB0aWJsZSBzcGVjaWVzIGRpc2Vhc2UgaW5jaWRlbmNlLCBzY3RsZCBwcmV2YWxlbmNlIChmcmFjdGlvbiBvZiBjb2xzIHdpdGggU0NUTEQgc2lnbnMpLCBhbmQgZGVhZCBjb2xvbmllcy4gCgojIyMjIyBTcGxpdCBieSBzaXRlCgpgYGB7cn0KI3N0YXRzX2ZpbHRlcmVkIGlzIGZyb20gYWJvdmUsIHdoZXJlIEkgdXNlZCB0aGUgYWdncmVnYXRlIGZ1bmN0aW9uIHRvIGdldCBtZWFuIGFuZCBTRQoKc3RhdHNfc2hvcnRmaWx0ZXJlZDwtc3Vic2V0KHN0YXRzX2ZpbHRlcmVkLHN1YnNldD1kYXRlcz49IjIwMTgtMTAtMzAiKQoKaW5jaWRlbmNlX2xvbmckc2l0ZTwtYyhyZXAoMyw0MikscmVwKDEsNDIpLHJlcCgyLDQyKSkKc2l0ZXMuaW5jaWRlbmNlPC1hZ2dyZWdhdGUobmV3SX5zaXRlK2RhdGUsRlVOPXN1bSxkYXRhPWluY2lkZW5jZV9sb25nKQpzaXRlcy5pbmNpZGVuY2UKc3RyKHN0YXRzX3Nob3J0ZmlsdGVyZWQpCmBgYAoKYGBge3J9CnNpdGVzLmluY2lkZW5jZSRuZXdJbmMuc2NhbGVkPC1zaXRlcy5pbmNpZGVuY2UkbmV3SS8xMDAKcHJldi5kYXRhPC1zdWJzZXQoc3RhdHNfc2hvcnRmaWx0ZXJlZCxzdWJzZXQ9U2l0ZT09IjEiKQppbmMuZGF0YTwtc3Vic2V0KHNpdGVzLmluY2lkZW5jZSxzdWJzZXQ9c2l0ZT09IjEiKQppbmMuZGF0YTwtc3Vic2V0KGluYy5kYXRhLHN1YnNldD1kYXRlPj0iMjAxOC0xMC0zMCIpCmNsYXNzKGluYy5kYXRhJGRhdGUpCgpwcmV2LmRhdGEKczEudHM8LWdncGxvdCgpKwogIGdlb21fbGluZShkYXRhPXByZXYuZGF0YSxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKSsKICBnZW9tX3BvaW50KGRhdGE9cHJldi5kYXRhLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpKwogIGdlb21fcG9pbnRyYW5nZShkYXRhPXByZXYuZGF0YSxhZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlLHltaW49ZnJhY3Rpb24tc3RhbmRlciwgeW1heD1mcmFjdGlvbitzdGFuZGVyKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiSGVhbHRoeSI9ImJsdWUiLCJTQ1RMRCI9InJlZCIsIkRlYWQiPSJibGFjayIsIlVua25vd24iPSJncmV5IiksZHJvcD1UUlVFKSsKICBnZW9tX2JhcihkYXRhPWluYy5kYXRhLGFlcyh4PWRhdGUseT1uZXdJbmMuc2NhbGVkKSxzdGF0PSJpZGVudGl0eSIsZmlsbD0ibGlnaHQgZ3JleSIpKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkZyYWN0aW9uIG9mIGNvbG9uaWVzIiwgYnJlYWtzPXNlcSgwLC4xLC4wMSksZXhwYW5kID0gYygwLCAwKSxsaW1pdHM9YygwLC4xKSxzZWMuYXhpcyA9IHNlY19heGlzKH4uKjEwMCxuYW1lID0iRGlzZWFzZSBpbmNpZGVuY2UiLGJyZWFrcz1jKDAsMiw0LDYsOCwxMCkpKSsKICBnZW9tX2xpbmUoZGF0YT1wcmV2LmRhdGEsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrCiAgZ2VvbV9wb2ludChkYXRhPXByZXYuZGF0YSxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKStnZW9tX3BvaW50cmFuZ2UoZGF0YT1wcmV2LmRhdGEsYWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSx5bWluPWZyYWN0aW9uLXN0YW5kZXIsIHltYXg9ZnJhY3Rpb24rc3RhbmRlcikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIkhlYWx0aHkiPSJibHVlIiwiU0NUTEQiPSJyZWQiLCJEZWFkIj0iYmxhY2siLCJVbmtub3duIj0iZ3JleSIpLGRyb3A9VFJVRSkrCgogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlRpbWVzIE5ldyBSb21hbiIpLGF4aXMudGV4dC54ID1lbGVtZW50X2JsYW5rKCkpKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkscGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSsKICBsYWJzKHg9IiIsY29sb3I9IlN0YXRlIikrCiAgc2NhbGVfeF9kYXRlKCBicmVha3M9c3RhdHNfZmlsdGVyZWQkZGF0ZXMsZGF0ZV9sYWJlbHM9IiIpCnMxLnRzCmBgYApgYGB7cn0KcHJldi5kYXRhPC1zdWJzZXQoc3RhdHNfc2hvcnRmaWx0ZXJlZCxzdWJzZXQ9U2l0ZT09IjIiKQoKaW5jLmRhdGE8LXN1YnNldChzaXRlcy5pbmNpZGVuY2Usc3Vic2V0PXNpdGU9PSIyIikKaW5jLmRhdGE8LXN1YnNldChpbmMuZGF0YSxzdWJzZXQ9ZGF0ZT49IjIwMTgtMTAtMzAiKQpwcmV2LmRhdGEKczIudHM8LWdncGxvdCgpKwogIGdlb21fbGluZShkYXRhPXByZXYuZGF0YSxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKSsKICBnZW9tX3BvaW50KGRhdGE9cHJldi5kYXRhLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpKwogIGdlb21fcG9pbnRyYW5nZShkYXRhPXByZXYuZGF0YSxhZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlLHltaW49ZnJhY3Rpb24tc3RhbmRlciwgeW1heD1mcmFjdGlvbitzdGFuZGVyKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiSGVhbHRoeSI9ImJsdWUiLCJTQ1RMRCI9InJlZCIsIkRlYWQiPSJibGFjayIsIlVua25vd24iPSJncmV5IiksZHJvcD1UUlVFKSsKICBnZW9tX2JhcihkYXRhPWluYy5kYXRhLGFlcyh4PWRhdGUseT1uZXdJbmMuc2NhbGVkKSxzdGF0PSJpZGVudGl0eSIsZmlsbD0ibGlnaHQgZ3JleSIpKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkZyYWN0aW9uIG9mIGNvbG9uaWVzIiwgYnJlYWtzPXNlcSgwLC4xLC4wMSksZXhwYW5kID0gYygwLCAwKSxsaW1pdHM9YygwLC4xKSxzZWMuYXhpcyA9IHNlY19heGlzKH4uKjEwMCxuYW1lID0iRGlzZWFzZSBpbmNpZGVuY2UiLGJyZWFrcz1jKDAsMiw0LDYsOCwxMCkpKSsKICBnZW9tX2xpbmUoZGF0YT1wcmV2LmRhdGEsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrCiAgZ2VvbV9wb2ludChkYXRhPXByZXYuZGF0YSxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKStnZW9tX3BvaW50cmFuZ2UoZGF0YT1wcmV2LmRhdGEsYWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSx5bWluPWZyYWN0aW9uLXN0YW5kZXIsIHltYXg9ZnJhY3Rpb24rc3RhbmRlcikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIkhlYWx0aHkiPSJibHVlIiwiU0NUTEQiPSJyZWQiLCJEZWFkIj0iYmxhY2siLCJVbmtub3duIj0iZ3JleSIpLGRyb3A9VFJVRSkrCgogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlRpbWVzIE5ldyBSb21hbiIpLGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkrCiAgbGFicyh4PSIiLGNvbG9yPSJTdGF0ZSIpKwogIHNjYWxlX3hfZGF0ZSggYnJlYWtzPXN0YXRzX2ZpbHRlcmVkJGRhdGVzLGRhdGVfbGFiZWxzPSIlYiAlZCAleSIpCgpzMi50cwpgYGAKYGBge3J9CnByZXYuZGF0YTwtc3Vic2V0KHN0YXRzX3Nob3J0ZmlsdGVyZWQsc3Vic2V0PVNpdGU9PSIzIikKCmluYy5kYXRhPC1zdWJzZXQoc2l0ZXMuaW5jaWRlbmNlLHN1YnNldD1zaXRlPT0iMyIpCgppbmMuZGF0YTwtc3Vic2V0KGluYy5kYXRhLHN1YnNldD1kYXRlPj0iMjAxOC0xMC0zMCIpCgpzMy50czwtZ2dwbG90KCkrCiAgZ2VvbV9saW5lKGRhdGE9cHJldi5kYXRhLG1hcHBpbmc9YWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSkpKwogIGdlb21fcG9pbnQoZGF0YT1wcmV2LmRhdGEsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGE9cHJldi5kYXRhLGFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUseW1pbj1mcmFjdGlvbi1zdGFuZGVyLCB5bWF4PWZyYWN0aW9uK3N0YW5kZXIpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJIZWFsdGh5Ij0iYmx1ZSIsIlNDVExEIj0icmVkIiwiRGVhZCI9ImJsYWNrIiwiVW5rbm93biI9ImdyZXkiKSxkcm9wPVRSVUUpKwogIGdlb21fYmFyKGRhdGE9aW5jLmRhdGEsYWVzKHg9ZGF0ZSx5PW5ld0luYy5zY2FsZWQpLHN0YXQ9ImlkZW50aXR5IixmaWxsPSJsaWdodCBncmV5IikrCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiRnJhY3Rpb24gb2YgY29sb25pZXMiLCBicmVha3M9c2VxKDAsLjMsLjA1KSxleHBhbmQgPSBjKDAsIDApLGxpbWl0cz1jKDAsLjMwKSxzZWMuYXhpcyA9IHNlY19heGlzKH4uKjEwMCxuYW1lID0iRGlzZWFzZSBpbmNpZGVuY2UiLGJyZWFrcz1jKDAsNSwxMCwxNSwyMCwyNSwzMCkpKSsKICBnZW9tX2xpbmUoZGF0YT1wcmV2LmRhdGEsbWFwcGluZz1hZXMoeD1kYXRlcyx5PWZyYWN0aW9uLGNvbG9yPXN0YXRlKSkrCiAgZ2VvbV9wb2ludChkYXRhPXByZXYuZGF0YSxtYXBwaW5nPWFlcyh4PWRhdGVzLHk9ZnJhY3Rpb24sY29sb3I9c3RhdGUpKStnZW9tX3BvaW50cmFuZ2UoZGF0YT1wcmV2LmRhdGEsYWVzKHg9ZGF0ZXMseT1mcmFjdGlvbixjb2xvcj1zdGF0ZSx5bWluPWZyYWN0aW9uLXN0YW5kZXIsIHltYXg9ZnJhY3Rpb24rc3RhbmRlcikpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIkhlYWx0aHkiPSJibHVlIiwiU0NUTEQiPSJyZWQiLCJEZWFkIj0iYmxhY2siLCJVbmtub3duIj0iZ3JleSIpLGRyb3A9VFJVRSkrCgogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiVGltZXMgTmV3IFJvbWFuIiksYXhpcy50ZXh0LnggPWVsZW1lbnRfYmxhbmsoKSkrCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpKwogIGxhYnMoeD0iIixjb2xvcj0iU3RhdGUiKSsKICBzY2FsZV94X2RhdGUoIGJyZWFrcz1zdGF0c19maWx0ZXJlZCRkYXRlcyxkYXRlX2xhYmVscz0iIikrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlRpbWVzIE5ldyBSb21hbiIpLGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzAsIGhqdXN0ID0gMSkpKwogIHNjYWxlX3hfZGF0ZSggYnJlYWtzPXN0YXRzX2ZpbHRlcmVkJGRhdGVzLGRhdGVfbGFiZWxzPSIlZCAlYiAleSIpCgpzMy50cwoKYGBgCgoKCmBgYHtyLGZpZy5oZWlnaHQ9NCxmaWcud2lkdGg9NH0KI3RpZmYoIkZpZ3VyZTIudGlmZiIsd2lkdGg9MTgwLCBoZWlnaHQ9MzAwLHVuaXRzPSJtbSIscmVzPTMwMCkKKHMyLnRzL3MxLnRzL3MzLnRzKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzPSJBIikKI2Rldi5vZmYoKQpgYGAKCgoK